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;
}
標準庫的 fgets 會保留換行符,但這裡手寫一個版本:
max-1 個字元,留一位給結束符 \0。EOF 或 \n 停止。_getline 逐行讀取標準輸入。strstr 判斷模式是否出現在行中。$ gcc -o mini_grep mini_grep.c
$ echo -e "apple\nbanana\napricot" | ./mini_grep ap
apple
apricot
regex.h)。-i 忽略大小寫、-n 顯示行號等選項。這個迷你版雖簡單,但展示了 C 語言處理文字流的核心模式:逐行讀取 → 字串匹配 → 輸出,是許多文字處理工具的基礎雛形。