C 同一段代码的代码::块和表意符的结果不同

C 同一段代码的代码::块和表意符的结果不同,c,C,我试图运行K&R手册中的这段代码来计算输入中的字符数: int main() { int count=0; while(getchar()!=EOF) count++; printf("%d",count); return 0; } 我没有在Code::Blocks中获得任何输出,因为每次单独处理输入的每个字符后,getchar由于while循环再次请求新的输入,并且控制不会继续到打印行。那么,为什么我要在Ideone上获得所需的输出呢。

我试图运行K&R手册中的这段代码来计算输入中的字符数:

int main()
{
    int count=0;
    while(getchar()!=EOF)
        count++;
        printf("%d",count);
return 0;
    }

我没有在Code::Blocks中获得任何输出,因为每次单独处理输入的每个字符后,getchar由于while循环再次请求新的输入,并且控制不会继续到打印行。那么,为什么我要在Ideone上获得所需的输出呢。例如,如果我输入Hello,它将给出输出5,而不是请求新的输入。这里有什么问题

如注释部分所述,按enter键无法到达
EOF
。 跳出while循环的一种方法是,使用
break
编写一些
if
语句,如下例所示,当您按下
space
时,它将跳出循环。 另一种方法是按Ctrl+d键退出循环

int main(){
 int count=0;
    while(getchar()!=EOF){
       count++;
    if(getchar() == ' '){
      break;
      }
    printf("%d",count);
   }
return 0;
}

试试这样:

int main()
{
    int count = 0;
    while(getchar() != '\t') // If tab is entered we break
    {
       count++; // iterate
       printf("%d\n", count); // print counter
   }
   return 0;
}
当您输入选项卡时,控制台将停止请求输入。但只有当循环退出时,才会打印打印

编辑:

我认为Ideone有一种特殊的方法来处理EOF。当Ideone计算了输出文本区域中的所有内容时,它似乎自动地放置EOF。我找不到手动复制EOF的方法,即使是通过编写
\n
。但是,使用字符作为退出循环的方式似乎是正确的

我不知道它是否能帮助您,但我在Ideone的常见问题解答中找到了这一点

当输入失败时,
getchar()
函数返回
EOF
。这并不意味着它读的是“EOF字符”或类似的东西。在此上下文中,您不应将EOF视为“文件结束”的意思

当您从Code::Blocks运行程序时,您从未做过任何导致输入失败的事情。所以输入从未失败,所以循环条件始终为true


当ideone运行程序时,它将使用您运行程序时提供的输入作为输入。当输入全部处理完毕后,尝试获取更多输入失败,因此循环中断。

如何为代码块版本提供EOF命令?这可能就是问题所在。按enter键不会产生EOF。正如@Lundin所说,按enter键不能提供EOF。您可以尝试将输入写入一个文件,并在执行时将输入通过管道传输到可执行文件中。您可以尝试
a.exe
,其中file.txt包含您想要作为输入的字符串。否则,某些系统也会在输入中接受ctr+d作为EOF。那么为什么它会在Ideone上输出?这是我最大的疑问。有了这段代码,当我输入
Hello\t
\t
being tab)时,它就会输出
12345
。你呢?不,我指的是我写的代码(即我使用EOF的地方)。你的代码很好。我在问为什么我的代码会在Ideone上输出。它如何理解我只想输入12345(比如说),而不要求进一步的输入,而Code::Blocks要求对相同的代码进行进一步的输入(由于循环机制)?“如果你知道的话,请帮助我。”哈希特我编辑了我的答案。请让我知道它是否对你有帮助。你强调了EOL,但OP询问EOF,你说什么是好的。但我真正想问的是:为什么我的代码在Ideone上给出输出。它如何理解我只想输入12345(比如说),而不要求进一步的输入,而Code::Blocks要求对相同的代码进行进一步的输入(由于循环机制)?这是Ideone的问题吗?我没有发现代码有任何问题,我已经从命令行和代码块测试了它,所以它们都给了我相同的结果。我不熟悉Ideone如何解释代码。在Ideone中,您在执行程序之前在缓冲区中指定输入。所以它知道不会有更多的输入。它通过插入EOF来发出流结束的信号。在控制台中,您可以键入任何需要的内容。控制台何时插入EOF?它怎么知道你什么时候打字完毕?如果您从具有固定内容长度的文件获取输入,或者如果您使用ctr+d明确表示输入结束