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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

6397閲覧

C言語stdinについてです。

strike1217

総合スコア651

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/06/01 08:02

編集2017/06/01 13:42

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

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

C

1while((ch = getchar()) != EOF) 2 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行適当な文字列を入力すれば、それで終わるのではないでしょうか?
なぜ終了しないのですか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

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/02 14:49

編集2017/06/02 15:15
Eki

総合スコア429

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

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

strike1217

2017/06/02 14:51

ん?ctrl + dが本当のEOFという事ですか?
Eki

2017/06/02 14:53

そうですね。 例えばGoogle等で「linux eof ctrl」と検索してみるとよく分かります。
strike1217

2017/06/02 14:59

ほんとですね! キーボードからの入力はstdinファイルからですよね? そしたら、stdinファイルの中にもEOFが存在しているのではないでしょうか?
Eki

2017/06/02 15:10

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

2017/06/02 15:17

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

2017/06/03 05:39

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

0

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

投稿2017/06/01 08:09

ttyp03

総合スコア16996

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

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

strike1217

2017/06/01 08:10

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

2017/06/01 08:17

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

2017/06/01 08:25

ほおお・・・初めて知りました。そうなんですか? ctrl+cとはまた別ですよね?
guest

0

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

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

投稿2017/06/01 08:08

coco_bauer

総合スコア6915

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

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

strike1217

2017/06/01 08:09

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問