【问题标题】:Breaking while loop by EOF通过 EOF 打破 while 循环
【发布时间】:2014-03-09 22:16:41
【问题描述】:

我正在努力解决这个问题,我需要你的帮助。

我有这个代码...

while(a != EOF){
  scanf("%f",&a);
  ...
}

...我想通过按 CTRL+D 来终止这个循环。它有效,但我需要按两次。我试过用这个

while(getchar() != EOF){
  scanf("%f",&a);
  ...
}

但结果相同。有什么方法可以通过只按一次 CTRL+D 来结束这个循环吗? 感谢您的回复。

【问题讨论】:

    标签: c while-loop eof


    【解决方案1】:

    您可以直接在scanf中检查EOF:

    while (scanf("%f",&a) != EOF) {
        ...
    }
    

    有关更多信息,请阅读 scanf 上的文档(其中an example)。

    【讨论】:

    • 如果scanf 返回 0,这将导致无限循环(如果输入无法解析为浮点数,则会出现这种情况)。
    • 对。在这种情况下,可能会使用“== 1”而不是“!= EOF”,但当参数数量发生变化时,更难维护。
    【解决方案2】:

    您应该检查对scanf 的调用结果,不仅是检查EOF,还要确保正确解析了值。 scanf 返回成功扫描的项目数,在您的特定情况下,如果成功扫描一个浮点数,它将返回 1。如果解析不成功,那之后就不能再依赖a的值了。

    int result;
    do
    {
        while ((result = scanf("%f", &a)) != EOF)
        if (result == 1)
        {
            // scan was successful, you can safely use the value of "a"
        }
        else
        {
            // scan was unsuccessful
            // you can skip to the next line, produce an error, etc.
        }
    }
    

    【讨论】:

      【解决方案3】:

      你至少有两个解决方案:

      我。

      while (scanf("%f",&a) != EOF) { ... }

      二。 从File Descriptor获取一个

      【讨论】:

        【解决方案4】:

        尝试测试来自scanf() 的返回:如果您的流已结束,它将返回EOF

        【讨论】:

        • 一般这不是一个好主意,好像scanf失败了,他不检查scanf的结果,他会执行一个无效数据的操作。如果他确实检查了scanf 结果,则不需要feof(stdin)
        【解决方案5】:

        试试这个,这可能对你有帮助:

        while(1) {
            scanf("%f",&a);
            if(a==EOF)
            break;
            ......
        }
        

        【讨论】:

          猜你喜欢
          • 2020-03-28
          • 1970-01-01
          • 1970-01-01
          • 2019-05-19
          • 1970-01-01
          • 2018-03-23
          • 2020-10-21
          • 2012-02-14
          • 2021-12-31
          相关资源
          最近更新 更多