| 狀態 | 說明 |
| NORMAL | 一般程式碼 |
| IN_C_COMMENT | 在 /* ... */ 內 |
| IN_CPP_COMMENT | 在 // ... 內 (輸出時保持) |
| IN_STRING | 在 "..." 內 |
| IN_CHAR | 在 '...' 內 |
核心邏輯 (簡化版)
int convert(FILE *in, FILE *out) {
int state = NORMAL, ch, next;
while ((ch = fgetc(in)) != EOF) {
switch (state) {
case NORMAL:
if (ch == '/') {
next = fgetc(in);
if (next == '*') { state = IN_C_COMMENT; fputs("//", out); }
else if (next == '/') { state = IN_CPP_COMMENT; fputs("//", out); fputc('/', out); }
else { fputc('/', out); fputc(next, out); }
} else if (ch == '"') { state = IN_STRING; fputc(ch, out); }
else if (ch == '\'') { state = IN_CHAR; fputc(ch, out); }
else fputc(ch, out);
break;
case IN_C_COMMENT:
if (ch == '*') {
next = fgetc(in);
if (next == '/') { state = NORMAL; fputc('\n', out); }
else { fputc('*', out); ungetc(next, in); }
} else if (ch == '\n') fputc('\n', out);
break;
// ... 其他狀態處理
}
}
return state == IN_C_COMMENT ? -1 : 0; // 未閉合檢查
}
關鍵難點處理
- 巢狀註解:C 標準不支援,但實際代碼可能出現,需決定是否支援或報錯。
- 字串/字元常數內的 /*:狀態機進入 IN_STRING/IN_CHAR 時忽略註解開始符。
- 多行註解換行:結束時補換行,保持行號對齊。
- 行尾註解:
code /* comment */ 轉為 code // comment\n。
完整程式碼結構
原始輸入包含完整的 AnnotationConvert、StartAnnotationConvert、main,可直接編譯執行測試。
- 上一篇文章: C 語言陣列傳遞函數退化為指標:sizeof 失效原因與解決之道
- 下一篇文章: C 語言雙重迴圈輸出 9x9 乘法表:格式化對齊技巧
Copyright ©
程式碼之家 All Rights Reserved