注释转换项目
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(FILE* fIn,FILE* fOut)//完成真实的转化
{
/*因为在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 char* inputFile,const char* outputFile)
{
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】对于函数的入口出口数据给出注释。
以上是关于注释转换项目的主要内容,如果未能解决你的问题,请参考以下文章