只要数据输入到C中,下面的C代码就会接受整数。在使用eof输入特定值时获取c中的无限循环
#include<stdio.h>
#include<conio.h>
void main()
{
int x;
while(scanf("%d",&x)!=EOF)
{
printf("%d\n",x);
}
getche();
}
它工作正常的整数输入,但在进入任何字符/浮动输入其变得无限loop.Why这样呢?
只要数据输入到C中,下面的C代码就会接受整数。在使用eof输入特定值时获取c中的无限循环
#include<stdio.h>
#include<conio.h>
void main()
{
int x;
while(scanf("%d",&x)!=EOF)
{
printf("%d\n",x);
}
getche();
}
它工作正常的整数输入,但在进入任何字符/浮动输入其变得无限loop.Why这样呢?
如果scanf
失败解析任何输入,它会将输入留在缓冲区并返回0
。由于错误的输入将永远不会离开缓冲区,并且您不会检查任何内容,只会返回EOF
,因此该循环将永远持续下去。
更好的检查是'while(scanf(“%d”,&x)== 1)'这意味着“只要1个参数可以转换” – 2014-09-30 13:07:52
非常感谢你的帮助:) – 2014-09-30 18:28:35
UNIX系统,您可以用Ctrl + d发送EOF上
无限循环可能获得,因为函数读取一个字符,看到它不是一个数字,并使其返回从中再次读取
缓冲区int main()
{
int n;
int c;
scanf("%d", &n);
scanf("%c", &c);
printf("%d %c\n", n, c);
return 0;
}
如果你把'a',那么你得到“0 a”标准输出。
如果输入的输入是'a',则'scanf('%d',&n);''将无法设置'n'.' printf(“%d%c \ n”,n,c);''会打印一个'_uninitialized_' n' - 这可能不是0.它是UB(未定义的行为)打印未初始化的值 – chux 2014-09-30 14:29:24
是的,我想表明scanf()把一个无效字符放回缓冲区 – 2014-09-30 14:32:37
感谢示例演示,它肯定有助于清除这个概念! – 2014-10-01 15:28:57
为什么使用'getche()'而不是'getch()'? – 2014-09-30 15:40:48