• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語の関数の戻り値がおかしい?)

C言語の関数の戻り値がおかしい?

このQ&Aのポイント
  • #C言語ポインタ完全制覇 本のP67に載っていたプログラムを再現しています。
  • get_word関数の中のif文で、EOFを返した時も無限ループになってしまう。
  • 環境で動作させたらおかしいだけではないかと疑問。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

1> while((ch = getc(fp)) != EOF && !isalnum(ch)); /*→「英数字のとき」このループは飛ばす。*/ 2>if(ch == EOF){/*もし英数字以外が入力されていたらメインプログラムにEOFを返す。*/ 2>return EOF; 2>} (略) 3>}while((ch = getc(fp)) != EOF && isalnum(ch)); 3>buf[len] = '\0'; 便宜上、番号を付けました ・「get_word関数の中のif文で、EOFを返した時」とは 2> のことですか? それなら、これでEOFが返れば >while(get_word(buf,256,stdin) != EOF){ が while(EOF != EOF)→while( 偽 )となりループが終了します。 3>でEOFになった場合も、次の呼び出しで getc()がEOFになるので、2>でEOFが返り、上と同様にループは終了します。 どこら辺で無限ループになる、とお考えですか?

rinnshan
質問者

お礼

ですよね。 理屈としてはkmeeさんがおっしゃっているように、ループは 終了する処理になってます。 とりあえず、客観的にこのプログラムは正しいと思うので 質問は締め切らせていただきます。 おさん方回答ありがとうございました^^

その他の回答 (2)

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.2

標準入力から、「EOF」を入力するには、 「CTRL+Z」だったかと思います。 処理系によってはやり方が違うかもしれません。 参考までにどうぞ。

rinnshan
質問者

お礼

せっかく回答していただいたのに申し訳ないのですが、標準入力 からEOFを入力させるプログラムではないです。 私の書き方がまずかったかもしれませんが… 関数get_wordによる戻り値がEOFならば、メイン関数の方の ループを抜けるのではないかと思ったのですが、少なくとも 私の環境では抜けないのです。

  • shinh
  • ベストアンサー率39% (363/926)
回答No.1

>if(ch == EOF){/*もし英数字以外が入力されていたらメインプログラムにEOFを返す。*/ return EOF; } 最初の文字を読み込んで EOF なら「 return EOF 」なので 下には行かず 戻るのでは?

rinnshan
質問者

お礼

そうですね。 戻るならば、 while(get_word(buf,256,stdin) != EOF){ printf("<<%s>>\n",buf); } の「get_word(buf,256,stdin) != EOF」部分の処理により ループを脱出するのではないかと思ったのです。 ところが、私の環境ではstdinにより「*?」などの文字以外を入力 して引数にしても、またメイン関数でstdinによる再入力を することになると言った動作になってしまっているのです。

関連するQ&A