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);
}
}
6条答案
按热度按时间a64a0gku1#
EOF
只是一个带有值(通常为-1)的宏,您必须针对EOF
测试某些内容,例如getchar()
调用的结果。测试流结束的一种方法是使用
feof
函数。注意,“流结束”状态仅在读取失败后设置。
在您的示例中,您可能应该检查scanf的返回值,如果这表明没有读取任何字段,则检查文件尾。
w80xi6nr2#
EOF
是C语言中的一个常量。您并不是在检查实际文件是否存在EOF。您需要执行以下操作这里是feof的文档。你也可以检查scanf的返回值。它返回成功转换的项数,或者
EOF
,如果它到达文件的结尾。lzfw57am3#
另一个问题是你只能用
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()
解析它。ifmq2ha24#
作为起点,您可以尝试替换
与
yeotifhr5#
您希望检查scanf()的结果以确保转换成功;如果没有,那么只有三种可能:
示例:
dffbzjpn6#