【问题标题】:Why does printf generate a garbage value when used in conjunction with a long type and a new line?为什么 printf 与 long 类型和新行结合使用时会生成垃圾值?
【发布时间】:2021-10-28 08:58:55
【问题描述】:

我目前正在阅读 C 编程语言的书,第 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 代表什么。是否会因为字符串缺少空终止符\0 而被视为垃圾值?

【问题讨论】:

  • 当您按下 Ctrl+D 并且 3 被覆盖时,您的终端可能决定回显 ^D。如果您为输入提供echo 123 | ./program 之类的管道,或者输入超过 9 个字符,是否仍然会发生这种情况?
  • 这很有趣!不,当我们使用echo 123 | ./program 进行管道传输时不会发生这种情况。这可能是命令^D 造成的。如果我们输入超过 9 个字符,它也不会发生输入:abcdefghij 输出:10
  • 我试图找出解释,因为行为似乎不一致。对于输入abcdefghij,我希望终端回显^D并得到输出10D
  • 3 覆盖 ^10 覆盖 ^D。您使用的是哪个操作系统?你是在行首按 Ctrl+D 吗?
  • 把printf改成printf("\n%ld\n", nc);可以看得更清楚。换句话说,在格式字符串的开头添加一个换行符\n

标签: c printf getchar


【解决方案1】:

我得到以下结果:3D

事情是这样的:

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

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

你不使用任何字符串数组来累积字符,所以不可能缺少\0字符串终止符。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多