【发布时间】:2019-01-06 02:41:06
【问题描述】:
在 Ritchie & Kernighan 的 C 编程语言书中,在 §1.5.2 计数字符中,给出了程序的两个版本:
#include <stdio.h>
/* count characters in input; 1st version */
int main() {
long nc;
nc = 0;
while (getchar() != EOF)
{
++nc;
}
printf("%ld\n", nc);
}
和
#include <stdio.h>
/* count characters in input; 2nd version */
int main() {
double nc;
for (nc = 0; getchar() != EOF; ++nc) {
; // null statement
}
printf("%.0f\n", nc);
}
它们都可以编译和工作,但总是输出比实际字数多一个字符。
例子:
"milestone" (9 characters) outputs 10
"hello, world" (12 characters) outputs 13
这是为什么?
是计算'\0' 字符还是我在键盘上按 Return 时给出的'\n'?
仅供参考:我在 MacOS 10.13.5 的终端上运行所有这些,并且文本已在 Atom 中输入。
【问题讨论】:
-
查看正在发生的事情的一种方法是在每个循环中打印出字符的值,这应该为接受第二个假设提供相当可靠的证据。 (没有从键盘读取'\0'字符--)
-
@user2864740:您通常可以键入 control-@ 以从键盘输入空字节。仅供参考——不太可能在这种情况下输入。
-
一种简单的查找方法,只在
getchar() != '\n'而不是EOF循环,看看它是否会输出预期的结果。另外,如果您要计算整数,为什么要使用double?我怀疑你会遇到半个字符。 -
@Havenard 我正在关注 Ritchie & Kernighan 的书。他说在某些机器上 Int 只有 16 位,所以 Double 会给我们更多的“力量”。
-
@NeeratheWildMage 好吧,就像在编码微控制器或其他东西时,即使在那里你也应该找到支持 32 位的类型,如
long。据我所知long将始终至少为 32 位,即使在编码 8 位微控制器时也是如此。重要的是要记住,这种“力量”是以更多内存为代价的,when you have 25 bytes of RAM available 你不能分配你不需要的位。
标签: c output character counting