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

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

詳細はこちら
C

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

Q&A

解決済

2回答

1249閲覧

【c言語】ループと個数表現

OHASI

総合スコア97

C

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

0グッド

0クリップ

投稿2021/01/14 13:20

###前提・実現したいこと
【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; }

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

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

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

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

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

int32_t

2021/01/14 13:33

"fully" は1個で合っているのでは?
kazuma-s

2021/01/14 15:35

キーワードは単語ではないのですか? lly を探すと、visually と fully を見つけてしまいますが、それでもいいんですか? 未初期化の t で、tlen = strlen(t); はいけません。tlen = 0; でしょう。
dodox86

2021/01/15 01:55

> 1.最後までループするように、if(j == klen)のelseを消して、i++を付けました。 > 2.if(j == klen)の中に、共通するワードの個数を表示するcntを付けました。 何と言いますか、「標準関数の使い方」などの自分にとって未知のことへの質問なのではなく、どちらかというとご自身の考えたロジックの不備にまつわる問題なのですから、コードをいじくり回す前に頭の中で考えたロジックが充分にコードに反映されているか確認しましょう。必要であればデバッガーを使いましょう。
OHASI

2021/01/15 03:09

丁寧な解説ありがとうございました。
guest

回答2

0

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

投稿2021/01/14 23:24

y_waiwai

総合スコア88040

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

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

OHASI

2021/01/15 03:12

分かりました。ありがとうございました。
guest

0

ベストアンサー

表示される(間違い)<ターミナル>のキーワードfullyofの誤りだと思いますが、

1つ見つけた後はfound1となりますが、whileの条件式にfound !=1が含まれているために2つ目以降を探していませんよ。

diff

1- while(i+klen-1 < tlen && found !=1 ) 2+ while(i+klen-1 < tlen)

投稿2021/01/14 14:06

編集2021/01/14 14:30
SHOMI

総合スコア4079

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

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

OHASI

2021/01/15 03:12

丁寧な解説、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問