c/c++註釋風格轉換
阿新 • • 發佈:2018-12-03
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; }