注释转换项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注释转换项目相关的知识,希望对你有一定的参考价值。


注意事项:

(1)中英文状态下

(2)在c语言中变量的声明要放在函数开头的最前边

(3)对于代码比较长的工程应该写完一小部分然后测试,这样可以提高效率,不要等到把所有的代码都写完以后在测试这种方法不可取。

(4)第二次打开失败,在这种状况下可能第一次打开文件时成功也有可能是失败。为了避免错误,在第二次打开文件之前应该关闭第一次打开的文件 。  

(5)如果文件存在,但依旧打开失败,借助errno可以看到具体的错误是什么(在工具窗口输入具体的错误码,即可知道错误原因)

例如:当前我写的程序错误码为2,在错误查找窗口 显示系统找不到指定文件

(6) 换行问题

/* int i=0;*/int j=0 

a)如果遇见c语言收尾的时候后边还有字符,应该加一个换行符,然后再进行读写操作。   

/* int i=0;*/

int j=0 

b)如果遇见c语言收尾的时候后边没有字符就不用换行,但是在实际的操作中是隐含换行符的。

考虑到这两点问题后,处理后的正确结果应该为:

//int i=0;

int j=0;

7)针对匹配问题,运用枚举增加程序的可读性使得更容易明白什么时候是注释的开始,什么时候是注释的结束

(8)由于各个注释转化条件之间会相互干扰,比如:

第5种注释转化的时候

/**//**/ 

读取出来的结果为:

//

/**

因为读到第二个/的时候多读了一个next使得程序读到了第三个/

所以必须使用 fseek函数使得指针向前偏移一个单位,确保读取正确。

AnnotationConvert.h

#define _CRT_SECURE_NO_WARNINGS 1

#pragma once   //保证文件被多次包含的时候只编译一次

#include<assert.h>

#include<errno.h>

typedef enum State

{

C_BEGIN,//表示c语言注释的开始

C_END,

//表示c语言注释的开始

CPP_BEGIN,

CPP_END,

}State;

void Convert(FILEfIn,FILEfOut)//完成真实的转化

{

/*因为在c语言中读取了两个字符才能识别相应的一个知识转化*/

char first,second;

State tag=C_END;

assert(fIn);

assert(fOut);

//使用do..while循环使得程序至少循环一次

do

{

   first=getc(fIn);

   switch(first)

{

      /*考虑c语言注释出现的不同状态*/

    case‘/‘:

second=fgetc(fIn);

if(second==‘*‘)

{

//3匹配问题

if(tag==C_END)

{

fputc(‘/‘,fOut);

    fputc(‘/‘,fOut);

tag=C_BEGIN;

}

else

{

fputc(‘/‘,fOut);

    fputc(‘*‘,fOut);

}


}

/*7c++注释问题*/

else if(second==‘/‘)

{

char next;

fputc(‘/‘,fOut);

fputc(‘/‘,fOut);


do

{

  next=fgetc(fIn);

  fputc(next,fOut);

}while(next!=‘\n‘&&next!=EOF);

 

}

else

{

fputc(first,fOut);

fputc(second,fOut);


}

break;

case‘\n‘:

//4多行注释问题

fputc(‘\n‘,fOut);

if(tag==C_BEGIN)

{

fputc(‘/‘,fOut);

fputc(‘/‘,fOut);

}

else if(tag==CPP_BEGIN)

{


}

break;

case‘*‘:

second=fgetc(fIn);

//2.换行问题

if(second==‘/‘)

{

      char next=fgetc(fIn);

  //5连续注释问题

  if( next==‘/‘)

  {

/*在读取下一个字符时使得指针向前偏移一个单位*/

  fputc(‘\n‘,fOut);

  fseek(fIn,-1,SEEK_CUR);

  }

  else if(next!=‘\n‘&&next!=EOF)

  {

     fputc(‘\n‘,fOut);

 fputc(next,fOut);

  }

  else

  {

    fputc(‘\n‘,fOut);

  }

  tag=C_END;

}

//6连续的**/问题

else if(second==‘*‘)

{

fputc(first,fOut);

fseek(fIn,-1,SEEK_CUR);

}

else

{

fputc(first,fOut);

fputc(second,fOut);

}


break;

default:

fputc(first,fOut);

break;

}

}while(first!=EOF);

}

 

//定义一个注释转化的函数,函数的参数为输入文件和输出文件,

//const保护被修饰的东西防止意外修改,增强程序的健壮性

void  AnnotationConvert(const charinputFile,const charoutputFile)

{

ConvertState ret;

FILE *fIn,*fOut;

/*运用c语言里的文件指针打开文件*/

 fIn=fopen(inputFile,"r");

/*打开文件可能会失败,所以要做检查*/

 if(fIn==NULL)

 {

/*如果打开文件指针为空,则显示打开文件失败

如果文件存在,但依旧打开失败,借助errno可以看到具体的错误是什么*/

 printf("打开文件%s失败,errno: %d\n",inputFile,errno);

    return FILE_ERROR;

 }

 fOut=fopen(outputFile,"w");

 if(fOut==NULL)

 {

/*在打开文件前关闭上一个文件*/

 fclose(fIn);

 printf("打开文件%s失败,errno: %d\n",outputFile,errno);

    return;

 }

 

 ret=Convert(fIn,fOut);

  fclose(fIn);

  fclose(fOut);

  return ret;

}

 

 

 

Test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

#include"AnnotationConvert.h"

int main()

{

ConvertState ret=AnnotationConvert("input.c","output.c");

 if(ret==FILE_ERROR)

 {

 printf("打开文件失败\n");

 }

 else if(ret==SUCCESS)

 {

 printf("转换成功\n");

 }

 else if(ret==NO_MATCH)

 {

 printf("匹配不成功\n");

 }

system("pause");

   return 0;


后记:

出色注释的基本要求

【规则1】注释应当准确、易懂,防止有二义性。错误的注释不但无益反而有害。

【规则2】边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。

不再有用的注释要及时删除。

【规则3】注释是对代码的“提示”,而不是文档。程序中的注释应当简单明了,注释太

多了会让人眼花缭乱。

【规则4】一目了然的语句不加注释。

例如:i++; /* i 1 */

多余的注释

【规则5】对于全局数据(全局变量、常量定义等)必须要加注释。

【规则6】注释采用英文,尽量避免在注释中使用缩写,特别是不常用缩写。

因为不一定所有的编译器都能显示中文,别人打开你的代码,你的注释也许是一团乱

码。还有,你的代码不一定是懂中文的人阅读。

【规则7】注释的位置应与被描述的代码相邻,可以与语句在同一行,也可以在上行,但

不可放在下方。同一结构中不同域的注释要对齐。

【规则8】当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于

阅读。

【规则9】注释的缩进要与代码的缩进一致。

【规则10】注释代码段时应注重“为何做(why)”,而不是“怎么做(how)”。

说明怎么做的注释一般停留在编程语言的层次,而不是为了说明问题。尽力阐述“怎么做”

的注释一般没有告诉我们操作的意图,而指明“怎么做”的注释通常是冗余的。

【规则11】数值的单位一定要注释。

注释应该说明某数值的单位到底是什么意思。比如:关于长度的必须说明单位是毫米,

米,还是千米等;关于时间的必须说明单位是时,分,秒,还是毫秒等。

【规则12】对变量的范围给出注释。

【规则13】对一系列的数字编号给出注释,尤其在编写底层驱动程序的时候(比如管脚

编号)。

【规则13】对于函数的入口出口数据给出注释。


以上是关于注释转换项目的主要内容,如果未能解决你的问题,请参考以下文章

扫描代码注释并转换为标准格式的工具[关闭]

共享项目转换在背面的片段中不起作用

vscode 用户代码片段 vue初始化模板 Snippet #新加入开头注释 自动生成文件名 开发日期时间等内容

C注释转换到C++注释项目

注释转换——(小项目)

C语言小项目—注释转换