首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言迷你版 grep 實現:從標準輸入過濾字串

     編輯:關於C語言

簡介

grep 是 Linux 系統中最常用的文字搜尋工具。本文展示一個極簡的 C 語言版本,僅支援從標準輸入讀取行並輸出包含指定模式的行,核心邏輯不足 30 行,適合初學者理解檔案 I/O 與字串處理。

完整原始碼

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

#define MAXLINE 1000

int _getline(char *line, int max);

int main(int argc, char **argv) {
    char line[MAXLINE];
    int found = 0;

    if (argc != 2) {
        printf("Usage: find pattern\n");
    } else {
        while (_getline(line, MAXLINE) > 0) {
            if (strstr(line, argv[1]) != NULL) {
                printf("%s", line);
                found++;
            }
        }
    }
    return found;
}

int _getline(char *line, int max) {
    int i, c;
    for (i = 0; i < max - 1 && (c = getchar()) != EOF && c != '\n'; i++) {
        line[i] = c;
    }
    if (c == '\n') {
        line[i] = c;
        i++;
    }
    line[i] = '\0';
    return i;
}

關鍵點解析

1. 自訂 _getline 函數

標準庫的 fgets 會保留換行符,但這裡手寫一個版本:

  • 最多讀取 max-1 個字元,留一位給結束符 \0。
  • 遇到 EOF 或 \n 停止。
  • 若讀到換行符,將其存入緩衝區並計入長度。
  • 回傳實際讀取的字元數,0 表示讀到檔案結尾。

2. 主迴圈邏輯

  • 檢查參數個數,僅接受一個模式字串。
  • 呼叫 _getline 逐行讀取標準輸入。
  • 使用 strstr 判斷模式是否出現在行中。
  • 符合則輸出該行並累計計數。
  • 程式回傳值為匹配行數,方便腳本判斷。

編譯與使用範例

$ gcc -o mini_grep mini_grep.c
$ echo -e "apple\nbanana\napricot" | ./mini_grep ap
apple
apricot

擴展建議

  • 支援正則表達式(引入 regex.h)。
  • 新增 -i 忽略大小寫、-n 顯示行號等選項。
  • 直接讀取檔案而非標準輸入,實現完整 grep 功能。

這個迷你版雖簡單,但展示了 C 語言處理文字流的核心模式:逐行讀取 → 字串匹配 → 輸出,是許多文字處理工具的基礎雛形。

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