• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語でループから抜けれない)

C言語でループから抜けれない

このQ&Aのポイント
  • C言語でループから抜けれないという問題に遭遇しました。
  • Visual Studioでのデバック中に、特定の行でループが抜け出せなくなってしまいました。
  • どの部分を修正すれば問題が解決するのか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.1

>for (i = 0;i < 1000;i=i+1) { > fgets(sin[1000], sizeof(sin[0]), fp); > if (strcmp(sin, "EOF") == 0) { > break; > } >この行でループが抜け出せなくなってしまいました。 もしこの記述でループを抜け出したいなら、ファイルの末尾に文字で"EOF"と書いておくか、手入力なら入力終了の合図に「EOF」と打ち込む、ということが必要です。 でもそんなことは課題の中に書いてないし、あなたも考えていませんよね。 ご質問の記述だと、ファイルのどこにも「EOF」と書いておらず、ファイル末尾に達したなら、それ以上読み込める者は何もないので、入力を読めない→でも"EOF"文字列は出てこない→入力を読めない…(以下略)と、無限ループに陥ってしまうわけです。 なので、入力に「『EOF』と言う文字列があること」を期待するのではなく、「ファイルを最後まで読んだ(本当にこれ以上読めない)」ということを検出するようにしましょう。 それを調べるのは、feof()関数。 >feof | Programming Place Plus C言語編 標準ライブラリのリファレンス >https://programming-place.net/ppp/contents/c/appendix/reference/feof.html なので、上記ページのサンプルにもある if( feof(fp) ){ break; } とすれば抜けられるようになるでしょう。 でも、その前の行 > fgets(sin[1000], sizeof(sin[0]), fp); ここは > fgets(sin[i], sizeof(sin[0]), fp); こうすべきですよね? 1,000行までのファイル内容を、一行ずつ順にsin[0] sin[1] sin[2] …へと取り込みたいわけです。 で、一行ずつsin[i]に取り込んでいき、ファイルをすべて読み切った時、sin[i] にはヌルストリングが入ります。 ヌルストリングは、長さ0の文字列。 長さ0とは、1文字目のデータが「0」である、ということ。 ですので、そこを判定基準に使うことも可能です。 if (sin[i][0] == 0) { break; } こちらの記述でも、抜けられるでしょう。

asai555666
質問者

お礼

分かりやすい説明、ありがとうございます。

関連するQ&A