首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言讀取工程目錄下 .c 源文件並識別註釋

     編輯:程式設計綜合問答

需求:在工程目錄下讀取 .c 源文件,分析文件中是否包含 /* */ 塊註釋或 // 行註釋。可通過文件操作與字符掃描實現。

核心思路

  1. 使用 fopen 以文本模式打開源文件("r")與目標文件("w")。
  2. 逐行讀取(fgets)或逐字符讀取(fgetc)。
  3. 維護狀態機識別註釋:
    • 普通狀態 → 遇到 / 進入「可能註釋」狀態
    • 下一字符為 / → 行註釋,跳過至換行
    • 下一字符為 * → 塊註釋,跳過至 *//
    • 其他 → 歸還字符,繼續普通處理
  4. 非註釋內容寫入新文件;註釋內容可選擇保留、刪除或標記。

關鍵代碼片段(處理行註釋)

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 或成熟預處理器替代手寫解析器。

完整示例代碼見原內容,已包含雙重註釋處理邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved