c/c++注释风格转换

C注释风格/* hhhfjjjsjd    */

C++注释风格//huajaijdh

                    //hushushdxkk

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*/

转换关系图:

#include <stdio.h>
#include <assert.h>

/*
fopen/fclose

getchar - 文件内读 -> fgetc
putchar - 文件内写 -> fputc

printf  - 文件内打印 -> fprintf

*/

#if 0

/* ... *

1. /* ... */
2. /* ... * 9527
3. /* ... **/

#endif

#include <stdio.h>

// 状态
typedef enum {
	CODE,	// 代码状态
	YU_DAO_XIE_GANG,	// 遇到 /
	C_COMMENT,			// C 风格注释
	CPP_COMMENT,		// C++ 风格注释
	YU_DAO_XING			// C 风格中遇到 *
}	State;

// GBK 一个汉字占两个字符(char, char)
void Convert(FILE *pIn, FILE *pOut)
{
	// 当前状态, CODE 是初始状态
	State state = CODE;
	const char * state_desc[] = {
		"正常状态",
		"遇到 / ",
		"C 风格注释",
		"C++ 风格注释",
		"C 风格中遇到 * "
	};

	int ch;
	int nextCh;
	while (1) {

		// 从输入文件依次读出一个字符
		ch = fgetc(pIn);

		// 处理读完文件的情况
		if (ch == EOF) {
			break;
		}

		printf("读到字符: %c,当前状态: %s --> ", (char)ch, state_desc[state]);

		// 根据当前状态 + 读到的字符,决定下个状态
		switch (state) {
		case CODE:
			if (ch == '/') {
				state = YU_DAO_XIE_GANG;
			}
			fputc(ch, pOut);
			break;
		case YU_DAO_XIE_GANG:
			if (ch == '*') {
				state = C_COMMENT;
				fputc('/', pOut);
			}
			else if (ch == '/') {
				state = CPP_COMMENT;
				fputc(ch, pOut);
			}
			else {
				state = CODE;
				fputc(ch, pOut);
			}
			break;
		case C_COMMENT:
			if (ch == '*') {
				state = YU_DAO_XING;
			}
			else {
				fputc(ch, pOut);
				if (ch == '\n') {
					fprintf(pOut, "//");
				}
			}
			break;
		case CPP_COMMENT:
			if (ch == '\n') {
				state = CODE;
			}
			fputc(ch, pOut);
			break;
		case YU_DAO_XING:
			if (ch == '/') {
				state = CODE;
				nextCh = fgetc(pIn);
				if (nextCh != '\n') {
					fputc('\n', pOut);
				}
				ungetc(nextCh, pIn);
			}
			else if (ch != '*') {
				state = C_COMMENT;
				fputc('*', pOut);
				fputc(ch, pOut);
			}
			else {
				// 上一个 *,而不是 ch 这个 *
				fputc('*', pOut);
			}
			break;
		}

		printf("%s\n", state_desc[state]);
	}
}

int main()
{
	// 相对路径,绝对路径
	// 相对路径
	FILE *pIn = fopen("input.c", "r");
	if (pIn == NULL) {
		perror("fopen input");
		return 1;
	}

	// a -> append
	FILE *pOut = fopen("output.c", "w");
	if (pOut == NULL) {
		perror("fopen output");
		fclose(pIn);
		return 1;
	}

	Convert(pIn, pOut);

	fclose(pOut);
	fclose(pIn);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/sing_Hwang/article/details/84193324