將c語言的註釋轉換成c++的註釋
/*......*/ 轉成 //......
測試用例:
1.一般情況
/* int a = 0; */
2.連續*
/***/
3.換行問題
/* int b = 0; */ int c = 0;
/* aaa */
int d = 0;
4.匹配問題
/*AAA/*BBB*/
/*int e = 0;/*xxxxxx*/
5.多行註釋
/*
AAA
BBB
CCC
*/int aa;
6.連續註釋
/*aaa*//*bbb*/
7.c++註釋 (遇到c++註釋直接讀完一行)
// /**/
# include<stdio.h> # include<stdlib.h> enum Tag { C_BEGIN, C_END, }; void Convert(const char* fIn,char* fOut) { FILE* Input = fopen(fIn, "r"); if (NULL == Input) { printf("打開文件%s失敗\n",fIn); return; } FILE* Output = fopen(fOut, "w"); if (NULL == Input) { printf("打開文件%s失敗\n", fOut); return; } Tag tag = C_END; char ch = fgetc(Input); char second; while (ch != EOF) { switch (ch) { case '/': fputc('/', Output); second = fgetc(Input); if (second == '*') { //4.匹配問題 if (tag == C_END) { fputc('/', Output); tag = C_BEGIN; } else { fputc('*', Output); } } else if (second == '/') // 7. 碰到c++註釋,讀完一行 { fputc(second, Output); char cur; do { cur = fgetc(Input); if (cur == EOF) { return; } fputc(cur, Output); } while (cur != '\n'); } else { fputc(second, Output); } break; case '*': second = fgetc(Input); if (second == '/' && tag == C_BEGIN) { // 3. 換行問題 char next = fgetc(Input); if (next != '\n' && next != EOF) { fputc('\n', Output); fseek(Input, -1, SEEK_CUR); //6.連續註釋 /**//**/ } else { fputc(next, Output); } tag = C_END; } else // 2. /***/ { fputc('*', Output); fseek(Input, -1, SEEK_CUR); } break; case '\n': fputc('\n', Output); // 5. 多行註釋 if (tag == C_BEGIN) { fputc('/', Output); fputc('/', Output); } break; default: fputc(ch, Output); } ch = fgetc(Input); } fclose(Input); fclose(Output); } void Test() { Convert("Input.cpp","Output.cpp"); } int main() { Test(); system("pause"); return 0; }