2014-09-30 84 views
1

只要数据输入到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这样呢?

+0

为什么使用'getche()'而不是'getch()'? – 2014-09-30 15:40:48

回答

4

如果scanf失败解析任何输入,它会将输入留在缓冲区并返回0。由于错误的输入将永远不会离开缓冲区,并且您不会检查任何内容,只会返回EOF,因此该循环将永远持续下去。

+3

更好的检查是'while(scanf(“%d”,&x)== 1)'这意味着“只要1个参数可以转换” – 2014-09-30 13:07:52

+0

非常感谢你的帮助:) – 2014-09-30 18:28:35

1

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”标准输出。

+0

如果输入的输入是'a',则'scanf('%d',&n);''将无法设置'n'.' printf(“%d%c \ n”,n,c);''会打印一个'_uninitialized_' n' - 这可能不是0.它是UB(未定义的行为)打印未初始化的值 – chux 2014-09-30 14:29:24

+0

是的,我想表明scanf()把一个无效字符放回缓冲区 – 2014-09-30 14:32:37

+0

感谢示例演示,它肯定有助于清除这个概念! – 2014-10-01 15:28:57