質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.82%

C言語stdinについてです。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,095

strike1217

score 585

scanf関数やgetchar関数など、標準入力を取得する関数は多数あると思いますが、
どれもstdinファイルから文字列を取得しているわけですよね?

ネット上で、以下のようなプログラムをよく見かけます。

while((ch = getchar()) != EOF)
       putchar(c);


永久に終わりません・・・

1、例えば、you will make me happyと入力した場合、最後に改行コードが入ってstdinファイルに保存されると思うのですが・・・
ファイルの最後には、必ずEOFがあるので、入力した1行+改行コード+EOF
キーボードからの入力も必ず最後にEOFがあるですかね?
すると一回入力したら終了するのではないでしょうか??

getchar()はあまり使わないのでよく知らないのですが、scanf()の正規表現を使わない場合「改行」が区切りになるので、入力した1行のみの取得になるので、EOFによる条件では永遠に終了できないですよね?

getchar()も同じだとすると上記のようなプログラムの意味がちょっとわかりません・・・わざと無限ループにしたプログラムということでしょうか?

2、キーボードからEOFを入力することはできますか?
#define EOF (-1)だと思うのですが、-1を入力しても終了しないんですよね・・・
man asciiでやって、EOFのコードを調べてもEOFなんて出てこないです。

EOFがよく分からない件

Linux 64bit Debian系です。

[追記]
標準出力の場合でも同じですね。
printf("you will make me happy\n");

stdoutファイルに1行+改行コード+EOFという風に入ると考えてよろしいのでしょうかね?

[追記2]
上記のようなプログラムは、getchar()はスペースや改行も取得するようなので、stdinファイルの最後のEOFがあれば終了しますよね?
つまり1行適当な文字列を入力すれば、それで終わるのではないでしょうか?
なぜ終了しないのですか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

EOFはWindows環境ではCtrl+Zだったかと思いますが,Linux等ではCtrl+Dだと思います。
Linux環境でCtrl+Zを入力するとプロセスがサスペンドしますね。見た目上ではプログラムが終了したかのようにプロンプトが戻ってきますが,psコマンドなどを実行してみるとばっちり表示されます。この状態は眠っているだけなので,bgとコマンドを打てばプロセスはバックグラウンドで走るし,fgと入力すればまたフォアグラウンドに戻ってきます。

Ctrl+CはプロセスにSIGINTというシグナルを発します。シグナルについてはWikipediaを参照してもらうと良いと思います。シグナルハンドラを設定すれば,特定のシグナルを受け取ったときの動作を自分で指定してやることもできますが,そうでなければ,SIGINTはプロセスを終了させます。

なお,キーボードから-1と入力してもそれは文字としての'-','1','\n'という入力にすぎないので,Cの世界の数値としての-1つまりEOFを入力することはできません。また,キーボードからの入力の末尾に一行ごとにEOFがあるのでもないので,Ctrl+Dなどで明示的に入力する必要があります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/03 00:10

    stdinには自動的にEOFは入らないと思います(詳しい方に聞けば例外はあるのかもしれませんが)。なので自分でCtrl+Dを入力してやる必要があります。
    逆に,勝手に改行ごとになど付加されたら困りません?ファイルからも標準入力からも入力できるような設計のプログラムをつくろうとしても,キーボードからだと一行で入力が終端したとみなされてしまいます。

    キャンセル

  • 2017/06/03 00:17

    stdinファイルには、EOFはないという事ですね!

    キャンセル

  • 2017/06/03 14:39

    確かめました。
    stdinなどの特別なファイルには、EOFは存在しないようです。

    キャンセル

0

キーボードで、コントロールキーを押しながら、Zキーを押す(control-Z)と、EOFが入力されます。

だから、いつでも好きな時に質問のプログラムを止めることが出来ます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/01 17:09

    ctrl+z = EOFと同じなのですか!!
    はじめて知りました。

    キャンセル

0

CTRL+Zを入力してみてください。
ループを抜けるはずです。
-1を入力しても終了しないのは、-1をgetcharで1文字ずつ処理しているからです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/01 17:10

    ctrl+zはシェルの機能なのではないのでしょうか?

    キャンセル

  • 2017/06/01 17:17

    シェル・コマンドプロンプトでCtrl+Zは受け付けますが、それ自体が強制終了の機能ではありません。
    あくまでもプログラムがCtrl+Z(EOF)を受け取って終了させる必要があります。
    その終了条件(この場合は継続の条件ですが)が「(ch = getchar()) != EOF」に相当します。

    キャンセル

  • 2017/06/01 17:25

    ほおお・・・初めて知りました。そうなんですか?

    ctrl+cとはまた別ですよね?

    キャンセル

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

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る