我在下面有一小段代码,我正在使用PellesC运行。
当执行代码并且我在控制台中输入了几个字符时,我按下回车键。
你能解释一下为什么printf("%ld\n", nc);
行似乎没有被执行?因为没有输出写入控制台。
#include <stdio.h>
int main(void)
{
long nc = 0;
while(getchar() != EOF)
{
++nc;
}
printf("%ld\n", nc);
}
我决定使用K&amp; R书彻底学习C,我很尴尬地说这个相当基本的例子让我感到难过。
答案 0 :(得分:34)
按Enter键实际上不会导致EOF
(“文件结束”)。你必须表明你已完全提供输入;在Unix上,你通常按 Ctrl D 来做到这一点。在Windows上我相信它是 Ctrl Z 然后是回车,但我真的不确定。
答案 1 :(得分:19)
当到达文件末尾时,您只能从流中获得EOF
,不行尾。如何发出文件结束信号取决于您的操作系统和终端设置。
在UNIX类型系统上通常是 CTRL d ,在Windows上通常是 CTRL z 。对于处于熟化模式的UNIX(正常输入模式),您通常必须将其作为行的第一个字符输入,并使用换行符( ENTER )进行操作。
使用Windows,可以在该行的任何位置输入 CTRL z ,但仍需要后跟换行符。
在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
您可以在第二行的末尾看到eof
设置为^D
( CTRL d )。您可以使用以下命令进行更改:
stty eof ^x
例如,将其设置为 CTRL x 。您还可以设置大量其他内容,其中大部分会使您当前的终端无法使用,所以要小心: - )
一句话,如果你想向你的程序发出文件已完成的信号,请使用UNIX的 CTRL d (或检查stty
如果没有'适用于Windows的 CTRL z 。如果您想获得输入的行,请使用代码中的\n
字符,如下所示:
#include <stdio.h>
int main (void) {
long nc = 0;
while(getchar() != '\n')
++nc;
printf("%ld\n", nc);
return 0;
}
答案 2 :(得分:4)
您如何结束输入以及您使用的系统?
如果您正在点击“中断”或“杀死”控制键组合,那么您可能会在打印之前将其删除。
如果你在unix上使用Ctrl-D或在Windows的一行开头使用Ctrl-Z,那么这将指示'输入结束'而不会终止进程。
您还可以尝试从测试文件重定向输入。 e.g:
myprogram <input.txt
答案 3 :(得分:4)
在Windows上,CTRL-Z或F6将发出文件结束的信号。
答案 4 :(得分:2)
ENTER以代码'\n'
编写。试试这个
#include <stdio.h>
int main(void)
{
long nc = 0;
/* count chars, except for ENTER */
while(getchar() != '\n')
{
++nc;
}
printf("%ld\n", nc);
return 0;
}
答案 5 :(得分:1)
“按回车”?代码中的循环继续迭代,直到它到达文件结束标记。 “按Enter键”不会导致EOF。如果要从键盘模拟EOF,请参阅终端的文档。例如,在Windows中,您必须按Ctrl + Z才能生成EOF。
答案 6 :(得分:0)
getchar()从standard in(通常是键盘)返回一个值。我不记得EOF会映射到哪个角色,但你可能无法输入它。
答案 7 :(得分:0)
输入您的输入并按Enter键 然后用于Windows的 ctrl + z 和用于Unix的 ctrl + d 然后按Enter键。 您可以在Image i附件中看到相同的内容。 肯定会。