|
標準入力された文字列を標準入力されたテキストまたはすでに存在するファイルから検索するプログラムをつくっています。
コンパイルはできるのですが、うまく文字列が検査されず困っています。教えていただけますか?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LINE_SIZE 1000
#define DATA_SIZE 100
int main(void){
FILE *st; /* ファイルポインタ*/
char buf[LINE_SIZE]; /*検索対象の文章をうけとる*/
char filename[DATA_SIZE]; /*検索対象のファイル名をうけとる*/
char key[20]; /*検索する文字列をうけとる*/
char op[3]; /*操作選択に使用*/
char *p;
int i,b_len,k_len;
int linenum=0; /*行数をぞえるための変数*/
int count=0;
p=buf;
b_len = strlen(buf);
k_len = strlen(key);
while(1){
printf("検索する文字列を入力してください:");
fgets(key,20,stdin);
printf("q) 最初に戻る\n");
printf("1) 入力した文章から検索\n");
printf("2) ファイルから検索\n");
printf("操作を選択してください: ");
fgets(op, 3, stdin);
if(strchr(op, L'q') != NULL){
break;
}
else if(strchr(op, L'1') != NULL){
printf("検索対象の文章を入力してください:");
fgets(buf,LINE_SIZE,stdin);
while (1){
p = strstr(p,key); /*pの位置から検索開始*/
if (p==NULL)
break;/*NULLなら検索終了*/
count++;
p= p+k_len;/*次の検索のためにポインタをずらす*/
}
printf("%d回\n",count);
}
return 0;
}
else if (strchr(op, L'2') != NULL){
printf("検索対象のファイル名を入力してください:");
fgets(filename, DATA_SIZE, stdin);
filename[strlen(filename)-1]='\0'; //改行文字をヌル文字に置換
/*ファイルのオープン*/
st = fopen(filename,"r");
if(st==NULL){
perror("fopen");
exit(EXIT_FAILURE);
}
/*オープンしたファイルへの操作*/
while(fgets(buf,LINE_SIZE,st) != NULL){ //1行ずつ読み出す
linenum++;
p = strstr(p,key); /*pの位置から検索開始*/
if (p==NULL)
break;/*NULLなら次の行*/
count++;
printf("%d回目--%d行目 %s\n",count,linenum,buf);
p =p+k_len;/*次の検索のためにポインタをずらす*/
}
if(ferror(st)!=0){
perror("fgetws");
exit(EXIT_FAILURE);
}
/*ファイルのクローズ*/
if(fclose(st)!=0){
perror("fclose");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}else{
printf("入力しなおして下さい。\n");
}
}
}
|