为什么 printf 与 long 类型和换行一起使用时会产生垃圾值?

Why does printf generate a garbage value when used in conjunction with a long type and a new line?

我目前正在阅读 C Programming Language(第 2 版)一书,遇到了一个产生奇怪结果的示例。我有一个简单的 C 程序,它打印用户通过控制台输入的字符数。

#include <stdio.h>

main()
{
    int c;
    long nc;

    nc = 0;

    while ((c = getchar()) != EOF) {
        if (c == '\n') {
            continue;
        }

        ++nc;
    }

    printf("%ld\n", nc);
}

奇怪的是,当我 运行 程序时,提供“abc”作为输入,然后通过 ctrl+d

发送 EOF 字符

我得到以下结果:3D

结果中的数字3是有道理的,因为我输入了3个字符,但我很好奇字母D代表什么。是否会因为字符串缺少空终止符而被视为垃圾值 [=12=]?

根据@Ry- 和@user3386109 的建议,^D 被实际结果覆盖,我们最终得到输出 3D。

3 覆盖了 ^ 而 D 没有被覆盖,所以它仍然存在,我们得到结果 3D

I get the following result: 3D

事情是这样的:

  • 您输入了 abc,然后按下了 return 键。
  • 您按下 Ctrl-D,终端将其回显为 ^D
  • 您的程序打印了 3(输入的非换行字符数),覆盖了 ^ 字符。
  • 你的程序打印了一个新行 \n,所以你得到了输出 3D.

您正在使用的终端正在以 ^ 表示法回显控制字符。

不使用任何字符串数组来累积字符,所以不可能缺少[=17=]字符串终止符。