为什么getchar()不能在控制台上识别返回EOF?

我在下面有一小段代码,我正在使用PellesC运行。

当代码执行并且我在控制台中输入了几个字符时,我按下回车键。

你能解释一下为什么printf("%ld\n", nc); 线似乎没有执行? 因为没有输出写入控制台。

 #include  int main(void) { long nc = 0; while(getchar() != EOF) { ++nc; } printf("%ld\n", nc); } 

我决定使用K&R书彻底学习C,我很尴尬地说这个相当基本的例子让我难过。

按Enter键实际上不会导致EOF (“文件结束”)。 你必须表明你完全已经完成提供输入; 在Unix上,您通常按Ctrl D执行此操作。 在Windows上我相信它是Ctrl Z后跟回车,但我真的不确定。

到达文件末尾时,您只能从流中获得EOF而不是行尾。 如何发出文件结束信号取决于您的操作系统和终端设置。

它通常是UNIX类型系统上的CTRL d和Windows上的CTRL z 。 对于处于熟化模式(正常输入模式)的UNIX,您通常必须将其作为行的第一个字符输入并使用换行符( ENTER )进行操作。

使用Windows, CTRL z可以输入到该行的任何位置,但仍需要后跟换行符。

在UNIX中,可以使用stty命令设置要通知终端接口要发送EOF的实际字符。 如果你执行stty -a ,你会看到类似的东西:

 speed 38400 baud; rows 45; columns 150; line = 0; intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = ; eol2 = ; 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 

您可以在第二行的末尾看到eof设置为^DCTRL d )。 你可以改变这个:

 stty eof ^x 

例如,将其设置为CTRL x 。 您还可以设置大量其他内容,其中大部分会使您当前的终端无法使用,所以要小心:-)

最重要的是,如果要向程序发出文件已完成的信号,请使用CTRL d for UNIX(或检查stty如果这不起作用)或CTRL z for Windows。 如果您想获得一行输入,请在代码中使用\n字符,如下所示:

 #include  int main (void) { long nc = 0; while(getchar() != '\n') ++nc; printf("%ld\n", nc); return 0; } 

您如何结束输入以及您使用的系统?

如果您正在点击“中断”或“终止”控制键组合,那么您可能会在打印之前终止您的进程。

如果您在unix上使用Ctrl-D或在Windows上的一行开头使用Ctrl-Z,那么这将指示“输入结束”而不会终止进程。

您还可以尝试从测试文件重定向输入。 例如:

 myprogram  

在Windows上,CTRL-Z或F6将发出文件结束的信号。

ENTER以代码'\n'写入。 试试这个

 #include  int main(void) { long nc = 0; /* count chars, except for ENTER */ while(getchar() != '\n') { ++nc; } printf("%ld\n", nc); return 0; } 

“按回车”? 代码中的循环继续迭代,直到它到达文件结束标记。 “按Enter键”不会导致EOF。 如果要从键盘模拟EOF,请参阅终端的文档。 例如,在Windows中,您必须按Ctrl + Z才能生成EOF。

getchar()从standard in(通常是键盘)返回一个值。 我不记得EOF将映射到哪个字符,但您可能无法输入它。

EOF工作

写下您的输入并按Enter键,然后按ctrl + z查看Windows,按ctrl + d查看Unix,然后按Enter键。 您可以在Image i附件中看到相同的内容。 肯定会。