【发布时间】: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。