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

时间:2009-11-24 23:15:39

标签: c

我在下面有一小段代码,我正在使用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,我很尴尬地说这个相当基本的例子让我感到难过。

8 个答案:

答案 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)

EOF Working

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