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

C 語言在文字檔案中搜尋字串並輸出位置、次數

     編輯:程式設計疑難解答

需求

讀取文字檔,搜尋使用者輸入的字串,輸出:是否匹配、匹配次數、每次匹配的行號與行內字元位移。

核心演算法

  1. 逐行讀取檔案(fgets),維護行號計數器。
  2. 對每行使用 strstr 迴圈查找所有出現位置(處理重疊匹配需手動移動指標)。
  3. 記錄每次匹配的 (行號, 行內偏移)。

參考實作

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_LINE 1024

int main() {
    FILE *fp = fopen("test.txt", "r");
    if (!fp) { perror("open"); return 1; }
    
    char keyword[256];
    printf("輸入搜尋字串: ");
    scanf("%255s", keyword);
    
    char line[MAX_LINE];
    int lineNo = 0, total = 0;
    size_t kwLen = strlen(keyword);
    
    while (fgets(line, MAX_LINE, fp)) {
        lineNo++;
        char *pos = line;
        while ((pos = strstr(pos, keyword)) != NULL) {
            total++;
            int offset = pos - line + 1; // 1-based 字元位置
            printf("匹配 #%d: 第 %d 行, 第 %d 字元\n", total, lineNo, offset);
            pos += kwLen; // 移至下一個可能位置(非重疊)
            // 若需支援重疊匹配,改為 pos += 1;
        }
    }
    
    if (total == 0) printf("未找到匹配。\n");
    else printf("共匹配 %d 次。\n", total);
    
    fclose(fp);
    return 0;
}

關鍵細節

  • fgets 保留換行符,strstr 不會跨行匹配,符合逐行邏輯。
  • 行內偏移計算:pos - line 為 0-based,通常顯示為 1-based。
  • 大檔案建議使用 mmap 或分塊讀取,避免單行過長超出 MAX_LINE。
  • 編碼一致性:確保檔案編碼(UTF-8/GBK)與程式執行環境一致,否則中文匹配會失敗。

進階擴充

  • 支援正則表達式:引入 regex.h (POSIX) 或 PCRE 庫。
  • 大小寫不敏感:自行實作 strcasestr 或轉大小寫後比對。
  • 多關鍵字同時搜尋:建立 Aho-Corasick 自動機,單次掃描完成所有匹配。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved