K&Rの1.5.2の質問には困惑しています。私はしばらくグーグルで検索し、文字を入力した後にEOF入力を指定する必要があることを知りました。
long nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
return 0;
EOF入力としてcommnad-Dとcontrol-Dの両方を試しましたが、何も機能しませんでした。macosxにEOF?
デフォルトでは、OS X(以前のMac OS X)端末は次の場合にEOF
を認識します Ctrl-D 行の先頭で押されます。
詳細には、実際の操作は、 Ctrl-D が押されると、端末の入力バッファ内のすべてのバイトが、端末を使用して実行中のプロセスに送信されます。行の先頭では、バッファにバイトがないため、プロセスは使用可能なバイトがゼロであると通知され、これはEOF
インジケータとして機能します。
この手順は、行末までにプロセスに入力を配信する方法としても機能します。ユーザーはいくつかの文字を入力して、 Ctrl-D、文字はすぐにプロセスに送信され、Enter/Returnが押されるのを通常待つことはありません。この「バッファリングされたすべてのバイトをすぐに送信」操作が実行された後、バイトはバッファに残りません。そうするとき Ctrl-D もう一度押すと、行の先頭と同じになり(バイトは送信されず、プロセスには0バイトが与えられます)、EOF
のように動作します。
ターミナルでコマンド「man 4 tty」を使用すると、ターミナルの動作について詳しく知ることができます。デフォルトの回線制御はtermiosです。コマンドman termios
を使用して、termios回線制御の詳細を確認できます。
端末でEOFがどのように設定されているかを確認するには、次のように入力します
stty all
私のMacでは、これは出力を与えます-
speed 9600 baud; 24 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
discard dsusp eof eol eol2 erase intr kill lnext
^O ^Y ^D <undef> <undef> ^? ^C ^U ^V
min quit reprint start status stop susp time werase
1 ^\ ^R ^Q ^T ^S ^Z 0 ^W
下から4行が表示されます。eofの3つのセルは^ Dです。
より詳細な説明があります here ここで情報を見つけました。
私はちょうどそれを理解しました。押す必要があります Ctrl+D+D。コントロールを押しながら D 二回。なんと奇妙なキーシーケンスかを言わなければなりません。