🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1152閲覧

【c言語】繰り返す方法が知りたいです。

OHASI

総合スコア97

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/01/13 14:34

編集2021/01/13 14:36

###前提・実現したいこと
【c言語】
入力したキーワードを、読み込んだテキストファイルの中から総当たり法で探し出すプログラムを作成しています。
■■入力したキーワードが、テキストのどこに位置するのかを表示する機能を、(Ctrl+D)が押されるまで繰り返したいです。
しかし、1回目は正しく表示されますが、2回目からは、1回目の数が表示されてしまいます。

###試したこと
繰り返すためにwhile(scanf("%s",k)!=EOF)で囲いました。

###読み込むテキストファイル ファイル名(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 /*文字列が一致した場所(先頭の添字)*/ キーワードを入力してください fully キーワード:fully /*正しい内容↓*/ 位置:197 キーワードを入力してください /*(Ctrl)+D で終了*/

###表示される(間違い)<ターミナル>

・・・ /*上記と同様*/ ・・・ キーワードを入力してください Snow キーワード:Snow 位置:0 キーワードを入力してください fully キーワード:fully /*間違いの内容↓*/ 位置:0

###コード

#include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) { char filename[21]; FILE *fp; char t[2000]; char k[80]; int n, i, j, found, klen, tlen; n = 0; i = 0; found = 0; printf("ファイル名を入力してください\n"); scanf("%s",filename); if((fp=fopen(filename,"r"))==NULL) { printf("FILE OPEN ERROR\n"); exit(1); } printf("ファイル%sの内容\n",filename); while(fscanf(fp,"%c",&t[n])!=EOF) { printf("%c",t[n]); n++; } tlen = strlen(t); printf("文字数=%d\n",n); printf("キーワードを入力してください\n"); /*******************うまくいかない範囲(ここから)*********************/ while(scanf("%s",k)!=EOF) { 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; else i++; } if(found==1){ printf("位置:%d\n",i); printf("キーワードを入力してください\n"); } else{ printf("見つかりませんでした\n"); printf("キーワードを入力してください\n"); } } /*****************************(ここまで)****************************/ fclose(fp); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

i、foundがループの中で初期化されてませんね

投稿2021/01/13 14:48

編集2021/01/13 14:50
y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/01/13 14:58

ほかにもまずいところがいくつか見受けられます C言語のコードを書くなら、デバッグできる環境を整えましょう。 Eclipseや、WindowsならVisualStudioなど。 コードの任意の場所で実行を止め、変数のナカミを見ることができます。そこから1行づつ実行して、コードの流れを見れるようになります そうすれば、アテズッポでコードを書かなくて済むようになります。
OHASI

2021/01/13 17:53

丁寧な解説とアドバイス、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問