EOFというものがC言語で使えるということを聞いたので試しにちょっとしたものを作ってみたんですが、

画像
補足

修正です。実行結果の正しくはこうです。 【実行結果】 数字を入力(EOFが入力されたら終了)→5<数字を入力する> 数字を入力(EOFが入力されたら終了)→3<数字を普通に入力すると入力待機状態になる> 数字を入力(EOFが入力されたら終了)→EOF<EOF、エンターを押すと…> 数字を入力(EOFが入力されたら終了)→数字を入力(EOFが入力されたら終了)→数字を入力(EOFが入力されたら終了)→数字を入力(EOFが入力されたら終了)→数字を入力(EOFが入力されたら終了)→数字を入力(EOFが入力されたら終了)→数字を入力(EOFが入力されたら終了)→数字を入力(EOFが入力されたら終了)→…以下略<…こうなりました。> 数字なら普通に入力できますし数字を入力した後はちゃんと入力待機画面になるのですが、EOFを入力すると無限ループ(っぽく見えるだけかも?実際に無限ループ状態なのかは分からない)になります。

ベストアンサー

3

3人がナイス!しています

その他の回答(5件)

1

>数字を入力(EOFが入力されたら終了)→EOF<EOF、エンターを押すと… EOF というのは ・入力がなくなったらこれを返すぜ、というお約束のint整数値 のことです。 文字並び "EOF" のことではありません。 C標準ライブラリの作成者が必ず Cソースコード において EOF という定数名で使えるように <stdio.h> で定義しなさい、 と義務づけられてるもの。 具体値はライブラリ実装者に任されます。 キーボードが標準入力になっているとき、どうやって ・これで入力はおしまい を指示するか? の方法は、C言語ではなく、実行環境(OSやターミナル) 依存です。 unix系OSであれば、多くの場合 Ctrl+D キー入力。 Windowsコマンドプロンプトでは Ctrl+Z <Enter> らしい。 Windowsではややこしくて、scanf とかの場合 Ctrl+Z を複数回 やんないとダメ... とかいう話もあるらしい。 "%d" を指示された scanf は、整数文字じゃないもの に出会ったら、 何もせず return するはず。 非整数文字 EOF を与えたらそうなります。 入力ストリーム上に 文字列 EOF は残ったまま。 scanf は戻り値で 変換指示子どおりに変換できた個数 を返します。 この場合 0 が返されてるはず。 それを判定すること無く scanf を呼び続けたなら、無限ループ になるでしょう。 判定してないあなたの責任。

1人がナイス!しています

0

scanf_sの返り値は、入力された値ではありません。 なので、 『scanf_sの返り値が、EOFでない間繰り返す』 という記述は、 『EOFが入力されたら終了』 には繋がりません。

なぜ無限ループとなるのか? それは、scanf_sの仕様をみるとわかります。 scanf_sが、フォーマットに一致しないデータを受け取ったときに、何を返すのか? ということが重要です。 そして、変換に失敗したあと、入力ストリームには何が残るのか?も重要です。 scanf_sが、返すのは変換に成功した数です。 1つも成功しなかった場合、0が返ります。 そして、変換に失敗した場合、ストリームは読み進められません。

0

無限ループになる理由は分かりますが、その前に実行結果が不可解です。 数字を入力(EOFが入力されたら終了)→ が表示された後に、入力待機状態にならず そのまま次の「数字を…」が表示されてしまうのですか? ちなみに、Visual Studio だとEOFが使えない、ということはないです。

詳しい回答は他の人を見れば良いです。 EOFと入力したところで、それは EOFという文字列を入力しただけで、End of File という原義のEOFにはなりません。 abc だって、なんだって、数字以外を入れれば無限ループになるでしょう。

0

EOFはキーボードから入力できない特殊な値だからねw 当然だと思いますよ。

0

プログラムは想像や適当には動きません。 ちゃんと仕様書読んでください。