【问题标题】:How to use EOF to end scanf loop?如何使用 EOF 结束 scanf 循环?
【发布时间】:2012-05-14 18:01:11
【问题描述】:

我需要接收数字,直到我按下回车键,我尝试将 scanf 的返回值与 EOF 进行比较,但它一直要求我输入更多数字(无限循环):

int fail=0, late=0, avg=0, i=0, last=0, current, permission, difference;
while(scanf(" %d", &current) != EOF)
{
    permission = (current < last);
    difference = ((last - current) >= 30);
    fail += difference*permission;
    late += permission;
    avg += (last - current)*(permission);
    last = last*(permission) + current*(!permission);
}

任何建议。
谢谢

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    好吧,scanf 规范说它将读取并忽略任何空白字符。此外,规范说只有在输入失败的情况下才会返回 EOF,然后才能成功读取任何数据。你可以自己阅读here

    我建议使用其他答案中提到的其他阅读功能。不过,如果您必须在该 scanf 循环中生存和死亡,也许您可​​以在底部添加以下代码:

    if (getchar() == '\n') break;
    

    如果您的输入只是数字,它应该可以工作,并且它只是使其工作的一种方法。

    【讨论】:

    • 请注意,毕竟它所做的是打破无限循环,因为 scanf 返回成功读取的项目数(不会为零)
    【解决方案2】:

    您遇到的一个问题是 scanf 的文档说大多数格式转换都会跳过空格。 (这包括回车和换行。)

    一种选择是一次读取一个字符,然后输入一些数字。通过这种方式,您可以捕获任何虚假输入。您还可以区分内联空格(空格和制表符)和行终止空格(CR 和 NL)。

    【讨论】:

      【解决方案3】:

      如果您使用的是 linux,您可以在输入 CTRL+D 时停止您的 while 循环

      EOF = CTRL + D(适用于 Linux)

      EOF = CTRL + Z(对于 Windows)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-27
        相关资源
        最近更新 更多