需求:在工程目錄下讀取 .c 源文件,分析文件中是否包含 /* */ 塊註釋或 // 行註釋。可通過文件操作與字符掃描實現。
fopen 以文本模式打開源文件("r")與目標文件("w")。fgets)或逐字符讀取(fgetc)。/ 進入「可能註釋」狀態/ → 行註釋,跳過至換行* → 塊註釋,跳過至 *//while (fgets(str, 99, fp) != NULL) {
for (i = 0; i < 99; i++) {
if (str[i] == '/' && str[i-1] == '/') {
str[i-1] = '\n';
str[i] = '\0';
break;
}
}
fputs(str, fp1);
}
int in_block_comment = 0;
while (fgets(str, 99, fp) != NULL) {
for (i = 0; i < 99; i++) {
if (!in_block_comment && str[i] == '/' && str[i-1] == '/') {
// 行註釋處理同上
break;
}
if (!in_block_comment && str[i] == '*' && str[i-1] == '/') {
in_block_comment = 1;
str[i-1] = '\0'; // 截斷註釋開始前內容
}
if (in_block_comment && str[i] == '/' && str[i-1] == '*') {
in_block_comment = 0;
// 移動剩餘字符到行首
for (j = 0; j < 98-i; j++) str[j] = str[i+j+1];
str[j] = '\0';
i = -1; // 重新掃描本行剩餘部分
}
}
if (!in_block_comment) fputs(str, fp1);
}
getcwd 獲取工程目錄,拼接文件名,避免硬編碼路徑。/ *(需更完善的詞法分析)。libclang 或成熟預處理器替代手寫解析器。完整示例代碼見原內容,已包含雙重註釋處理邏輯。