您的位置:首页 > 编程语言 > C语言/C++

注释转换!!!(考虑全面)

2015-10-17 19:29 441 查看
在C与C++中,将/**/的注释转换为//的注释。这是一个小型的项目。
测试用例:应考虑以下几种情况
// 1.一般情况
/* int i = 0; */

// 2.换行问题
/* int i = 0; */int j = 0;
/* int i = 0; */
int j = 0;

// 3.匹配问题
/*int i = 0;/*xxxxx*/

// 4.多行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int k = 0;

// 5.连续注释问题
/**//**/

// 6.连续的**/问题
/***/

// 7.C++注释问题
// /*xxxxxxxxxxxx*/

// 8.C注释本身不匹配
/* int i = 0;
程序代码如下:
//注释转换
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef  enum  Tg{
ANNOTATION_START,//注释开始
ANNOTATION_END,//注释结束
}Tag;
typedef  enum  State
{
SUCCESS_ANNOTATION,//成功转换
FILE_ERROR,//文件错误
NO_MATCH,//注释不匹配
OTHER_ERROR,//其他错误
}State;
State annotationConvert(FILE *fIn, FILE *fOut)
{
char firstCh, secondCh;
Tag  tag = ANNOTATION_END;//将标记置为注释结束
assert(fIn&&fOut);
while ((firstCh = fgetc(fIn)) != EOF)//不断接受字符当其不为EOF
{
switch (firstCh)//测试此时的读取字符
{
case '/':
{
secondCh = fgetc(fIn);
if (secondCh == '*'&&tag == ANNOTATION_END)//第三种情况,匹配问题
{
fputc('/', fOut);
fputc('/', fOut);
tag = ANNOTATION_START;//第一种情况,注释开始,置标记位为注释开始
}
else  if (secondCh == '/')//第七种情况,c++注释,则不转换
{
char next;
fputc(firstCh, fOut);
fputc(secondCh, fOut);
while ((next = fgetc(fIn)) != '\n'&&next != EOF)
{
fputc(next, fOut);
}
fseek(fIn, -1, SEEK_CUR);

}
else
{
fputc(firstCh, fOut);
fputc(secondCh, fOut);
}

break;
}
case  '*':
{
secondCh = fgetc(fIn);
if (secondCh == '*')//注释内出现‘*’字符
{
fputc('*', fOut);
fseek(fIn, -1, SEEK_CUR);

}
else if (secondCh == '/')
{
char next = fgetc(fIn);
if (next != '\n')
{
fseek(fIn, -1, SEEK_CUR);//第五种情况,连续注释
}
tag = ANNOTATION_END;
fputc('\n', fOut);//第二种情况,换行问题
}
else
{
fputc(firstCh, fOut);
fputc(secondCh, fOut);
}
break;
}
case '\n':
{
fputc('\n', fOut);
if (tag == ANNOTATION_START)//第四种情况,多行注释
{
fputc('/', fOut);
fputc('/', fOut);
}
break;
}
default:
{
fputc(firstCh, fOut);
break;
}
}
}
if (tag == ANNOTATION_START)//第八种情况,注释本身不匹配
return NO_MATCH;
else
return SUCCESS_ANNOTATION;

}
State  stateConvert(const char *input, const char *output)
{
FILE* fIn = fopen(input, "r");
if (fIn == NULL)
{
printf("open input error\n");
return  FILE_ERROR;
}
FILE* fOut = fopen(output, "w");
if (fOut == NULL)
{
printf("open output error\n");
fclose(fIn);
return  FILE_ERROR;
}
annotationConvert(fIn, fOut);
fclose(fIn);
fclose(fOut);
}
int  main()
{
State  sta=stateConvert("input.c", "out.c");
if (sta = SUCCESS_ANNOTATION)
printf("ANNOTATION SUCCESS\n");
else if (sta = FILE_ERROR)
printf("FILE error\n");
else if (sta = NO_MATCH)
printf("No  match\n");
else
printf("other error");
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息