for循环不执行循环外的任何指令

时间:2011-10-31 03:01:31

标签: c gcc for-loop

作为参考,我正在复制这个(几乎)来自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
%

2 个答案:

答案 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)。但是,为了清楚起见,我会使用大括号,或者将缩进保留在原件中。