Code :: Blocks和Ideone对同一段代码的结果不同

时间:2017-05-15 08:51:22

标签: c

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

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

我没有在Code :: Blocks中获得任何输出,因为每次单独处理输入的每个字符后, getchar 再次因为while循环而要求输入新的输入,并且控制没有&#39 ; t前进到打印行。然后,为什么我在Ideone上获得所需的输出。例如,如果我输入Hello,它会给出输出5,而不是要求输入新的输入。这里有什么问题?

3 个答案:

答案 0 :(得分:1)

输入失败时,getchar()函数会返回EOF 。这并不意味着它会读取一个" EOF字符"或类似的东西。您不应该将EOF视为意义"文件结尾"在这种情况下。

当您从Code :: Blocks运行程序时,您从未做过任何导致输入失败的事情。所以输入永远不会失败,所以你的循环条件总是如此。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分: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。我发现即使写\n也无法手动重现EOF。但是,使用字符作为退出循环的方法似乎正常工作。

我不知道它是否可以帮到你,但我在Ideone常见问题解答中找到了这个。

enter image description here