我在下面有一小段代码,我正在使用PellesC运行.
当代码执行并且我在控制台中输入了几个字符时,我按下回车键.
你能解释一下为什么这printf("%ld\n", nc);条线似乎没有被执行?因为没有输出写入控制台.
#include <stdio.h>
int main(void)
{
long nc = 0;
while(getchar() != EOF)
{
++nc;
}
printf("%ld\n", nc);
}
Run Code Online (Sandbox Code Playgroud)
我决定使用K&R书彻底学习C,我很尴尬地说这个相当基本的例子让我难过.
Jan*_*ger 34
按Enter键实际上不会导致EOF("文件结束").你必须表明你已完全提供输入; 在Unix上你通常按下来做CtrlD.在Windows上我相信它CtrlZ接着是输入,但我真的不确定.
pax*_*blo 19
EOF到达文件末尾时,您将只从流中获取,而不是行尾.如何发出文件结束信号取决于您的操作系统和终端设置.
它通常CTRLd在UNIX类型的系统和CTRLzWindows上.对于处于熟化模式(正常输入模式)的UNIX,您通常必须将其作为行的第一个字符输入并使用换行符(ENTER)跟随它.
使用Windows,CTRLz可以在线上的任何位置输入,但仍需要后跟换行符.
在UNIX中,EOF可以使用该stty命令设置要通知终端接口的实际字符.如果你执行stty -a,你会看到类似的东西:
speed 38400 baud; rows 45; columns 150; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D;
eol = <undef>; eol2 = <undef>; swtch = ^Z; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl
-cstopb cread -clocal -crtscts -ignbrk brkint -ignpar -parmrk
-inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany
-imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill
-ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo
-echoe -echok -echonl -noflsh -tostop -echoctl -echoke
Run Code Online (Sandbox Code Playgroud)
您可以在eof设置为^D(CTRLd)的第二行的末尾看到.你可以改变这个:
stty eof ^x
Run Code Online (Sandbox Code Playgroud)
CTRLx例如,将其设置为.您还可以设置大量其他内容,其中大部分会使您当前的终端无法使用,所以要小心:-)
最重要的是,如果您想要向程序发出文件已完成的信号,请使用CTRLdUNIX(或检查stty是否不起作用)或CTRLzWindows.如果您只想获得一行输入,请使用\n代码中的字符,如下所示:
#include <stdio.h>
int main (void) {
long nc = 0;
while(getchar() != '\n')
++nc;
printf("%ld\n", nc);
return 0;
}
Run Code Online (Sandbox Code Playgroud)