我被K&R中的1.5.2问题难住了。我在谷歌上搜索了一段时间,发现我必须在输入字符后提供EOF输入。
long nc = 0; while (getchar() != EOF) ++nc; printf("%ld\n", nc); return 0;
我尝试了command-D和control-D作为EOF输入,但没有任何效果。如何为Mac OS X提供EOF?
pgx2nnw81#
默认情况下,macOS(以前的OS X和Mac OS X)软件在行首按下Control-D时识别EOF。(我相信其他版本的Unix也有类似的行为。详细地说,实际操作是,当按下Control-D时,终端的输入缓冲区中的所有字节都被发送到使用终端的附加/前台进程。在一行的开始,缓冲区中没有字节,因此进程被告知有零个字节可用,这充当EOF指示符。此过程兼作在行尾之前向流程传递输入的方法:用户可以键入一些字符并按下Control-D,这些字符将立即发送到进程,而无需通常等待按下回车键。在执行此“立即发送所有缓冲字节”操作之后,缓冲区中将不留下任何字节。因此,当第二次按下Control-D时,它与一行的开头相同(不发送字节,并且进程被赋予零字节),并且它的行为类似于EOF。您可以通过在终端中使用命令“man 4 tty”来了解有关终端行为的更多信息。默认的行规则是termios。您可以通过使用man termios命令来了解有关termios行规则的更多信息。
EOF
man termios
68bkxrlz2#
如果您想查看终端中的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,这是我找到信息的地方。
7eumitmz3#
我刚想明白。你必须按Ctrl+D+D。按住控制键并按D两次。我不得不说这是一个多么奇怪的按键序列。
zsohkypk4#
在macOS Monterey中,ctrl + D是我需要启动EOF的所有内容。我是这么做的:1.使用gcc编译源代码1.运行可执行文件1.按ctrl + D在新行的最开始发送EOF我在程序的开头和结尾添加了两个额外的print,以验证ctrl + D实际上可以工作。
ctrl + D
4条答案
按热度按时间pgx2nnw81#
默认情况下,macOS(以前的OS X和Mac OS X)软件在行首按下Control-D时识别
EOF
。(我相信其他版本的Unix也有类似的行为。详细地说,实际操作是,当按下Control-D时,终端的输入缓冲区中的所有字节都被发送到使用终端的附加/前台进程。在一行的开始,缓冲区中没有字节,因此进程被告知有零个字节可用,这充当
EOF
指示符。此过程兼作在行尾之前向流程传递输入的方法:用户可以键入一些字符并按下Control-D,这些字符将立即发送到进程,而无需通常等待按下回车键。在执行此“立即发送所有缓冲字节”操作之后,缓冲区中将不留下任何字节。因此,当第二次按下Control-D时,它与一行的开头相同(不发送字节,并且进程被赋予零字节),并且它的行为类似于
EOF
。您可以通过在终端中使用命令“man 4 tty”来了解有关终端行为的更多信息。默认的行规则是termios。您可以通过使用
man termios
命令来了解有关termios行规则的更多信息。68bkxrlz2#
如果您想查看终端中的EOF设置,可以键入
在我的mac上,这给出了输出-
你可以看到从底部向上的四行,eof中的三个单元格是^D。
有一个更完整的描述here,这是我找到信息的地方。
7eumitmz3#
我刚想明白。你必须按Ctrl+D+D。按住控制键并按D两次。我不得不说这是一个多么奇怪的按键序列。
zsohkypk4#
在macOS Monterey中,
ctrl + D
是我需要启动EOF的所有内容。我是这么做的:
1.使用gcc编译源代码
1.运行可执行文件
1.按
ctrl + D
在新行的最开始发送EOF我在程序的开头和结尾添加了两个额外的print,以验证
ctrl + D
实际上可以工作。