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

在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;
}

你可能感兴趣的:(注释转换)