我对K& R的1.5.2问题感到困惑。我用Google搜索了一段时间,发现在输入字符后我必须提供EOF输入。
long nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
return 0;
我尝试将commnad-D和control-D作为EOF输入,但没有任何效果。任何想法如何为mac osx提供EOF?
答案 0 :(得分:59)
默认情况下,OS X(以前称为Mac OS X)终端在行开头按 Ctrl - D 时识别EOF
。
详细说明,实际操作是,当按下 Ctrl - D 时,终端输入缓冲区中的所有字节都将使用终端发送到正在运行的进程。在一行的开头,缓冲区中没有字节,因此告诉进程可用零字节,这就是EOF
指示符。
此过程兼作在行结束前向流程传递输入的方法:用户可以键入一些字符并按 Ctrl - D ,并且字符将立即发送到进程,而不是通常等待进入/返回按下。在执行“立即发送所有缓冲的字节”操作之后,缓冲区中不会留下任何字节。因此,当第二次按 Ctrl - D 时,它与行的开头相同(不发送任何字节,并且该过程被赋予零字节) ,它就像一个EOF
。
您可以在终端中使用命令“man 4 tty”了解有关终端行为的更多信息。默认的线路规则是termios。您可以使用命令man termios
了解有关termios线路规则的更多信息。
答案 1 :(得分:11)
如果要查看终端中设置的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
你可以从底部看到四行,eof中的三个单元格是^ D.
有一个更全面的描述here,这是我找到信息的地方。
答案 2 :(得分:7)
我只是想通了。您必须按 Ctrl + D + D 。按住控件并按 D 两次。我不得不说一个奇怪的键序列。