1. 程式人生 > >c/c++註釋風格轉換

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