#include #include #define BUF 0x10000 /* 1 行の長さ */ char* searchw(char *buf, char *str); /* ----- 滅入ん ----- */ void main(int argc, char *argv[]) { FILE *fp; char *buf; int line = 1; if (argc != 3) { /* コマンドライン引数のチェック */ fprintf(stderr, "エラー!:検索文字列とファイル名を指定してください\n"); /* だめです */ exit(1); } if ((buf = (char *)malloc(BUF)) == NULL) { /* バッファメモリ確保 */ fprintf(stderr, "エラー!:メモリを確保できません\n"); /* だめです */ exit(1); } printf("検索文字列:[%s] ファイル名:%s\n",argv[1], argv[2]); if ((fp = fopen(argv[2], "r")) == NULL) { /* 引数のファイル名をオープンしてみる */ fprintf(stderr, "エラー!:ファイルをオープンできません\n"); /* だめです */ free(buf); /* メモリ開放しておこう */ exit(1); } while (fgets(buf, BUF, fp) != NULL) { /* EOF まで読む..の? */ if (searchw(buf, argv[1]) != NULL) { /* 文字列検索関数を呼んでみる */ printf("%6d: %s", line, buf); /* どう云う訳か行番号つきw */ } line++; /* 行番号カウンタを増やす */ } fclose(fp); /* ファイルを閉じておく */ free(buf); /* メモリ開放 */ } char* searchw(char *buf, char *str) { char *src; /* 探される方って感じで */ char *dst; /* 探す方って感じで */ int wc = 0; /* ワイルドカードフラグ */ while (*buf != '\0') { /* 探される方の終端まで繰り返し */ src = buf; /* 探される方を初期化する (ただしループ毎に進んでいく) */ dst = str; /* 探す方を初期化する (常に文字列の先頭) */ while (*src != '\0') { /* 探される方の終端まで繰り返し */ if (*dst == '\0') { /* 探す方の終端だと「見つかった」扱い */ return buf; /* 見つかった位置らしい */ } if (*dst == '*') { /* 探す方に '*' があった */ wc = 1; /* ワイルドカードモードに突入 */ dst++; /* '*' を読み飛ばしておく */ } if (wc == 1 && *src == *dst) { /* wc モード中に *src と *dst が同じになった */ wc = 0; /* ワイルドカードモードから脱出 */ } if (*src != *dst && wc == 0) { /* 1 文字でも違ったらやり直し */ break; } src++; /* 探される方を進める */ if (wc != 1) { dst++; /* 探す方を進める */ } } buf++; /* 検索位置を進めてやり直し */ } return NULL; /* 見つからなかったしくしく.. */ }