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

C語言模式匹配:打印包含指定字符串的行

     編輯:關於C語言

簡易 grep 功能實現

本程序同樣出自《The C Programming Language》(第二版),實現了類似 Unix grep 的核心功能:從標準輸入讀取文本行,並打印出包含命令行參數指定模式(字符串)的所有行。

程式架構說明

  • main 函數檢查參數個數(需恰好一個模式參數),隨後循環調用自定義的 getline 讀取每一行。
  • 使用標準庫函數 strstr 判斷該行是否包含目標模式。
  • 若匹配成功,打印該行並累計匹配行數,最終作為返回值退出。

自定義 getline 函數

不同於標準庫的 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved