我正在使用以下C代码从用户那里获取输入,直到发生EOF,但问题是此代码无效,它在第一次输入后终止。任何人都可以告诉我这个代码有什么问题。提前谢谢。
float input;
printf("Input No: ");
scanf("%f", &input);
while(!EOF)
{
printf("Output: %f", input);
printf("Input No: ");
scanf("%f", &input);
}
答案 0 :(得分:42)
EOF
只是一个带值的宏(通常为-1)。您必须针对EOF
测试某些内容,例如getchar()
来电的结果。
测试流结束的一种方法是使用feof
函数。
if (feof(stdin))
请注意,“结束时”状态仅在读取失败后设置为。
在您的示例中,您应该检查scanf的返回值,如果这表明没有读取字段,则检查文件结尾。
答案 1 :(得分:8)
EOF
是C中的常量。您没有检查EOF的实际文件。你需要做这样的事情
while(!feof(stdin))
答案 2 :(得分:4)
另一个问题是,您只能使用scanf("%f", &input);
阅读。如果用户键入的内容无法解释为C浮点数,例如“pi”,scanf()
调用将不会向input
分配任何内容,也不会从那里进行任何操作。这意味着它会尝试继续阅读“pi”,然后失败。
鉴于其他海报正确推荐的while(!feof(stdin))
更改,如果您输入“pi”,将会有无限循环打印出input
的前值并打印提示,但是该程序永远不会处理任何新的输入。
scanf()
返回它所输入变量的赋值数。如果它没有赋值,那意味着它没有找到浮点数,你应该阅读更多输入,例如char string[100];scanf("%99s", string);
。这将从输入流中删除下一个字符串(最多99个字符,无论如何 - 额外的char
用于字符串上的空终止符。)
您知道,这提醒了我讨厌scanf()
的所有原因,以及为什么我使用fgets()
代替,然后使用sscanf()
解析它。
答案 3 :(得分:-1)
作为起点,您可以尝试替换
while(!EOF)
与
while(!feof(stdin))
答案 4 :(得分:-1)
您想检查scanf()的结果以确保转换成功;如果没有,那么三件事之一就是真的:
示例:
int moreData = 1;
...
printf("Input no: ");
fflush(stdout);
/**
* Loop while moreData is true
*/
while (moreData)
{
errno = 0;
int itemsRead = scanf("%f", &input);
if (itemsRead == 1)
{
printf("Output: %f\n", input);
printf("Input no: ");
fflush(stdout);
}
else
{
if (feof(stdin))
{
printf("Hit EOF on stdin; exiting\n");
moreData = 0;
}
else if (ferror(stdin))
{
/**
* I *think* scanf() sets errno; if not, replace
* the line below with a regular printf() and
* a generic "read error" message.
*/
perror("error during read");
moreData = 0;
}
else
{
printf("Bad character stuck in input stream; clearing to end of line\n");
while (getchar() != '\n')
; /* empty loop */
printf("Input no: ");
fflush(stdout);
}
}
答案 5 :(得分:-1)
while(scanf("%d %d",a,b)!=EOF)
{
//do .....
}