如何使用EOF结束scanf循环?

时间:2012-05-05 11:53:57

标签: c scanf

我需要接收数字,直到我按回车键,我试图将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);
}

任何建议。
thanx

3 个答案:

答案 0 :(得分:1)

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

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

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

如果您的输入只是数字,它应该可以工作,这只是让它解决的一种方法。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果您使用的是Linux,则可以在输入CTRL+D

时停止while循环

EOF = CTRL + D (适用于Linux)

EOF = CTRL + Z (适用于Windows)