###前提・実現したいこと
【c言語】たびたびすみません。
入力したキーワードを、読み込んだテキストファイルの中から総当たり法で探し出すプログラムを作成しています。
■■入力したキーワードが、テキストに何個あるか表示したいです。
###試したこと
1.最後までループするように、if(j == klen)
のelse
を消して、i++
を付けました。
2.if(j == klen)
の中に、共通するワードの個数を表示するcnt
を付けました。
###読み込むテキストファイル ファイル名(text.txt)
Snow is a challenging natural phenomenon to visually simulate. While the graphics community has previously considered accumulation and rendering of snow, animation of snow dynamics has not been fully addressed.
###正しい例<ターミナル>
ファイル名を入力してください text1.txt キー入力 ファイルtext1.txtの内容 Snow is a challenging natural phenomenon to visually simulate. While the graphics community has previously considered accumulation and rendering of snow, animation of snow dynamics has not been fully addressed. 文字数=215 テキストデータの文字数の表示 キーワードを入力してください Snow /*キー入力*/ キーワード:Snow /*キーワードの表示*/ 位置:0 /*文字列が一致した場所(先頭の添字)*/ 1個見つかりました /*個数表示*/ キーワードを入力してください of キーワード:of 位置:147 位置:166 2個見つかりました キーワードを入力してください /*(Ctrl)+D で終了*/
###表示される(間違い)<ターミナル>
・・・ /*上記と同様*/ ・・・ キーワードを入力してください Snow キーワード:Snow 位置:0 1個見つかりました キーワードを入力してください fully キーワード:fully /*2つ目が表示できない↓*/ 位置:147 1個見つかりました
###コード
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) { char filename[21]; FILE *fp; char t[2000]; char k[80]; int i, j, found, klen, tlen, cnt; printf("ファイル名を入力してください\n"); scanf("%s",filename); if((fp=fopen(filename,"r"))==NULL) { printf("FILE OPEN ERROR\n"); exit(1); } tlen = strlen(t); printf("ファイル%sの内容\n",filename); while(fscanf(fp,"%c",&t[tlen])!=EOF) { printf("%c",t[tlen]); tlen++; } printf("文字数=%d\n",tlen); printf("キーワードを入力してください\n"); while(scanf("%s",k)!=EOF) { cnt = 0; i = 0; found = 0; klen = strlen(k); printf("キーワード:%s\n",k); /*****************ここから******************/ while(i+klen-1 < tlen && found !=1 ) { j=0; while(j<klen && t[i+j] == k[j]) j++; if(j == klen) { found = 1; printf("位置:%d\n",i); cnt++; } i++; } if(found==1){ printf("%d個見つかりました\n",cnt); } else{ printf("見つかりませんでした\n"); } printf("キーワードを入力してください\n"); } /*****************ここまで******************/ fclose(fp); return 0; }
"fully" は1個で合っているのでは?
キーワードは単語ではないのですか?
lly を探すと、visually と fully を見つけてしまいますが、それでもいいんですか?
未初期化の t で、tlen = strlen(t); はいけません。tlen = 0; でしょう。
> 1.最後までループするように、if(j == klen)のelseを消して、i++を付けました。
> 2.if(j == klen)の中に、共通するワードの個数を表示するcntを付けました。
何と言いますか、「標準関数の使い方」などの自分にとって未知のことへの質問なのではなく、どちらかというとご自身の考えたロジックの不備にまつわる問題なのですから、コードをいじくり回す前に頭の中で考えたロジックが充分にコードに反映されているか確認しましょう。必要であればデバッガーを使いましょう。
丁寧な解説ありがとうございました。
回答2件
あなたの回答
tips
プレビュー