作为参考,我正在复制这个(几乎)来自The C Programming Language, Second Edition第18页的信函。
#include <stdio.h>
/*count characters in input, 2nd version*/
main(){
double n;
for (n = 0; getchar() != EOF; ++n)
;
printf("%.0f\n", n); /*this never prints*/
}
我不确定这是不是我的gcc版本(我是菜鸟):
% gcc --version
gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.
由于
for (n = 0; getchar() != EOF; ++n)
printf("%.0f",n); /*returns 0123456...n*/
我尝试打印“foo”而不是值n,只是为了看。它仍然没有打印。
我在这里缺少什么?我不喜欢前进而忽略了像这样的小问题。
=====================================
所以最终结果应该是:
% gcc ./counter.c -o ./counter
% ./counter
foo
3
现在,这是第一个代码段的输出:
% ./counter
foo
0123
第二个:
% ./counter
foo
^C
%
答案 0 :(得分:3)
如果您使用的是OSX或Linux机器,则需要在其自己的行上键入Ctrl+D
以生成EOF 字符。在Windows上,Ctrl+Z
在其自己的行上。不要在unix框中键入Ctrl+Z
,因为这样只会将您的进程发送到后台。
您正在输入Ctrl+C
,这是中断,并会向您的计划发送SIGTERM
。
在我的Mac上,我得到:
$ ./foo
hello
6D
或者,如果您不想发出EOF信号,请使用echo和pipe:
$ echo "hello" | ./foo
6
请注意EOF
必须独立。打印^D
,然后6覆盖^,所以看起来输出为6D
。
当然,在上面两个例子中,被计算的字符是h e l l o \n
。如果您不想换行,请执行以下操作:
$ echo -n "hello" | ./foo
5
答案 1 :(得分:1)
你不应该在这意味着你的循环中唯一的东西是空语句。for
之后有那个分号。
实际上,大卫是对的。空语句是循环中唯一的东西,但没关系。它将计算字符数。然后,在循环之外,它将打印总数。
这个demo表明它按预期工作(6个字符的输入导致打印6)。但是,为了清楚起见,我会使用大括号,或者将缩进保留在原件中。