为什么C程序打印0D而不是0? (当EOF作为Ctrl + D发送时)

时间:2011-11-29 05:19:20

标签: c macos

OSX 10.6.8,GCC 4.2 86_64

#include <stdio.h>

/* count lines in input */
main()
{
    int c, nl;

    nl = 0;
    while ((c = getchar()) != EOF)
        if (c == '\n')
            ++nl;
    printf("%d\n", nl);
}

运行

./a.out

ctrl+d发送EOF

0D

它应该只是0.为什么它会附加D?这是什么意思?

2 个答案:

答案 0 :(得分:16)

我已经看过这个了 - 它也让我很困惑。

终端回显^D,然后从程序输出0,覆盖插入符号。

您可以通过将程序中的打印格式更改为"\n%d\n"来证明这一点。


当被问及为什么?&#39;时,我去探索。答案是在tty设置中。对于我的终端,stty -a的输出是:

speed 9600 baud; 65 rows; 120 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
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^X; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;

请注意第二行末尾的echoctl - 它适用于“回音控制字符”。

$ stty -echoctl
$ cat > /dev/null
asdsadasd
$ stty echoctl
$ cat > /dev/null
asasada^D
$

您无法看到它,但是对于每个cat命令,我在asd个字符行的末尾键入了 Control-D ,并且击中返回后的第二个。提示在第二个示例中删除了第二个回显的^D

因此,如果您不喜欢回显控制字符,请关闭回音:

stty -echoctl

外壳也可能妨碍;我用 Control-R 进行了实验,我的shell(bash)决定进入

(reverse-i-search)`': aasadasdadadasdadadadadadsad

我输入了&#39; asd&#39;的非原创序列。字符,然后键入 Control-R ,这是我最终在shell中的地方。我打断了;我不确定反向搜索是什么,但我怀疑它是Emacs-ish;这不是我的预期。

答案 1 :(得分:1)

在Mac OSX上运行Xcode得到了这个输出:

第一线
第二行
现在我要在返回后按下控制器D. 3