本程序同樣出自《The C Programming Language》(第二版),實現了類似 Unix grep 的核心功能:從標準輸入讀取文本行,並打印出包含命令行參數指定模式(字符串)的所有行。
main 函數檢查參數個數(需恰好一個模式參數),隨後循環調用自定義的 getline 讀取每一行。strstr 判斷該行是否包含目標模式。不同於標準庫的 getline,此處實現了一個簡易版本:從 stdin 讀取字符至緩衝區,直到遇到 EOF、換行符或達到緩衝區上限。讀取到的換行符會被保留在字符串末尾,並以空字符結束。
#include <stdio.h>
#include <string.h>
/* 宣告自定義 getline 函數 */
int getline(char *, int);
/* find 函數:打印所有與第一個參數模式匹配的行 */
int main(int argc, char *argv[]) {
char line[1000];
int found = 0;
if (argc != 2) {
printf("Usage: %s pattern\n", argv[0]);
return 1;
}
while (getline(line, 1000) > 0) {
if (strstr(line, argv[1]) != NULL) {
printf("%s", line);
found++;
}
}
return found;
}
/* getline 函數:從標準輸入讀取一行,返回長度 */
int getline(char *line, int MAXLINE) {
char c;
int i;
for (i = 0; i < MAXLINE - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
line[i] = c;
if (c == '\n') {
line[i] = c;
++i;
}
line[i] = '\0';
return i;
}
$ gcc find.c -o find $ echo -e "apple\nbanana\napricot" | ./find ap apple apricot