かずま さんが書きました: ↑4年前
コード:
printf("検索文字列: %s\n", arg[1]);
すみません。arg[1] は argv[1] の間違いです。
元のプログラムについて、気になったことを述べます。
・「#include "pch.h"」pch.h の正体が分かりません。
・「#include <iostream>」これは C ではなく C++ のヘッダです。
wakaさんは「C言語初心者です」と言っているので変です。エラーにならない
のはソースファイルの拡張子を .c にしていないからではありませんか?
・「#include <stdlib.h>」不要だと思います。
・「#define BIT_SIZE 256 // バイトトサイズ」BUF_SIZE でしょう。
・「int line = 1; // 読み込んだ行数」まだ読み込んでいないのに 1?
int line = 0; にして、fgets の直後に line++: としたほうがよいのでは?
・「scanf("%s%*c", path);」%*c は不要です。
・「[ code]」codeタグの終了には / をつけて [/code] にします。
さて、【何度でも検索→表示ができる事】の件ですが、検索文字列を
コマンドライン引数で指定するということは、ファイル名を何度でも
入力して検索表示を繰り返すということではありませんか?
コード:
#include <stdio.h> // fopen, fclose, fgets, printf
#include <string.h> // strstr
#pragma warning(disable : 4996)
#define BUF_SIZE 256 // 入力行バッファサイズ
#define KEY_SIZE 100 // 検索文字列の最大文字数
int main(int argc, char *argv[])
{
FILE *fp; // ファイルポインタ
int line = 0; // 読み込んだ行数
char path[100]; // 入力ファイルのパス
char buf[BUF_SIZE]; // 入力行バッファ
char key[KEY_SIZE + 1]; // 検索文字列
if (argc != 2) {
printf("使用方法: %s key\n", argv[0]);
return 1;
}
while (1) {
printf("検索するファイル名を入力せよ(終了は .)→");
if (scanf("%s", path) != 1 || path[0] == '.') break;
fp = fopen(path, "r");
if (fp == NULL) {
printf("Error: %s このファイルは開けない。\n", path);
return 1;
}
while (fgets(buf, sizeof(buf), fp) != NULL) {
line++;
if (strstr(buf, argv[1]) != NULL)
printf("%d行目: %s", line, buf);
}
fclose(fp);
}
return 0;
}