K&R计算字符示例的帮助

3

我正在学习K&R的第二版,但在这个看似简单的例子中我却卡住了:

#include <stdio.h>

main(){
    double c;
    for(c = 0; ((getchar() != EOF) && (getchar() != '\n')); ++c)
        ;
    printf("%.0f\n",c);
}

它只是不能正常工作。我添加了 (getchar() != '\n') 部分,以便在按下回车时结束程序,但这并没有真正有所帮助。
这里是一些示例输出,使用的是 Mac OSX 10.6 开发工具自带的 gcc
pool-000:Desktop user$ ./a.out 
a
0
pool-000:Desktop user$ ./a.out 
asdf

2
pool-000:Desktop user$ ./a.out 
asfasf

3

显然有些问题。如果有帮助的话,我在第18页。这不是作业,只是为了好玩!谢谢 :)

看起来你有一些基本问题;你究竟想要实现什么? - Carl Norum
2
我猜你没有使用Ctrl+D来终止输入。请回到原始实现(不要使用!= '\n'),在输入结束时按下Ctrl+D。 - Mehrdad Afshari
谢谢,Mehrdad,那就是问题所在。非常感谢!如果您将其提交为答案,我会接受它。 - Isaac
2个回答

5
每次调用getchar()时,都会等待读取一个字符,因此在循环的每次迭代中,您读取的内容可能比您想象的要多。
另外,至少在我看来,计数器(几乎)从不使用double,应该使用整数类型,例如普通的int

也许将 getchar() 的信息放到首位?那是他代码的主要问题。double 的使用是次要的。 - user7116
是第二个 getchar() 导致了问题 - 谢谢!不过 K&R 的代码里有 double - Isaac

3
使用两个“getchar()”操作的问题在于,您将在条件测试中读取两个get字符……在到达++c之前。放弃“EOF”比较,它应该按您的预期工作。

也是一个很好的观点!谢谢 - 我现在更好地理解了getchar()的工作原理,以及C语言如何解释ctrl-D/EOF。 - Isaac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接