c语言 scanf("%d",&a);输入字符为什么会进入死循环?

int b=2,a=0;

scanf("%d",&a);

while(a != b)
{
printf("you lose!!\n");
scanf("%d",&a);
}
输入字符,为什么会进入死循环?

研究过scanf函数是怎样接收整型数字的吗?它要跳过所有非数字的字符专接收数字。那么输入了字符它就一直留在输入缓冲区;只要缓冲区有字符,scanf就要去读,一读不是数字,它就跳过,试图等到输入缓冲区没有字符了才等待你输入……如此反复,当然就“死循环”了。为了验证,你在printf("you lose!!\n");后加一句getchar();,把缓冲区里的那个非数字字符接收掉,看看还会不会是“死循环”?
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-01-17
scanf("%d",&a);
这语句只从输入缓冲区接收数字,输入字符时就不会接收,输入的字符永远在缓冲区内。
a没有接收值所以a的值为初值0。
所以a != b为真,进入while循环。
而while里面的scanf("%d",&a);语句一样会从缓冲区接收数字,但缓冲区还是前面输入的字符,所以还是接收不到。
所以a != b恒成立。
所以就会死循环。本回答被网友采纳
第2个回答  推荐于2017-09-24

    scanf("%d",&a); 应当键入数字,如果键入字母,scanf 语句执行失败,a当中未取得输入值,scanf函数返回0。

    不一定是死循环,根程功编制的能有关。

    有些情况,是由于输入流里的你键入的字母没有被清掉,后面的输入语句连续执行失败。可以用 fflush(stdin);  清除多余的字符。
    例程:

    #include<stdio.h>
    int main(){
     int n=9;
     scanf("%d",&n);
     printf("%d\n",n);
     fflush(stdin);  // 清除
     scanf("%d",&n);
     printf("%d\n",n);
     fflush(stdin);  // 清除
     scanf("%d",&n);
     printf("%d\n",n);
     return 0;
    }

第3个回答  2014-01-18

你这个问题可以利用scanf函数的返回值来解决,scanf函数的返回值是个整数,它的含义是输入和格式匹配的参数的个数,比如scanf("%d"%d",&a,&b); 如果输入 2 3,那就会返回2,输入2 a,返回1输入a 3 则返回0,一旦碰到格式不匹配的输入,就把不匹配的输入留在缓冲区并且拒绝读取,那么你这个例子的scanf("%d",&a);如果格式正确匹配的话会返回1,那就利用这一点来判断是否出现了不匹配的情况:

int b=2,a=0;
 scanf("%d",&a);
 while(a != b)
 {
     printf("you lose!!\n");
     if(scanf("%d",&a)!=1)  //如果不匹配
     {
      while(getchar()!='\n'){}; //清空输入缓冲,可能有字符串输入,所以用了循环
      } 
  }

追问

3QS

第4个回答  2014-01-17
因为scanf("%d",&a),%d要求的是数字,输入字符的话,a不会被赋值
也就是说a的值没有改变,while循环的条件不变,当然会继续执行

c语言 scanf(%d,a);输入字符为什么会进入死循环?
那么输入了字符它就一直留在输入缓冲区;只要缓冲区有字符,scanf就要去读,一读不是数字,它就跳过,试图等到输入缓冲区没有字符了才等待你输入……如此反复,当然就“死循环”了。为了验证,你在printf(you lose!!n);后加一句getchar();,把缓冲区里的那个非数字字符接收掉,看看还会不会是“死循...

C语言这个 代码 为什么 输入浮点型 和 整形 就会 进入死循环啊
这里scanf会检测用户输入的是否是整型,如果是整型,则从缓冲区读取赋给a,如果不是则不会赋值给a,则用户输入的东西 就会留在缓冲区中,这样就造成了下次scanf读取时,由于缓冲区中有东西存在,它会直接从缓冲区中读取,结果还是不符合,还是留在 缓冲区,就这样会一直下去。所以造成了死循环。

c语言中定义了int a;输入时故意输入字母就会死循环 怎么解决?
在C语言中,要输入值到整型变量a中,需要使用 scanf("%d",&a);如果是在循环中输入,那么一旦出错,就会导致后续均无法输入。为避免这种情况,可以使用判断scanf的返回值来确定输入是否成功。以下是循环输入整数,直到遇到-1退出的代码 while(1){ scanf("%d",&a); if(a == -1) break; ...

关于C语言的死循环问题。
scanf开始读取,%d的时候它只读取数字并且从缓冲区中删除这个数字,如果读取到非数字的时候就跳过不删除缓冲区中的数据,所以如果你把scanf放到循环里,你输入了非数字,scanf不删除缓冲区中的非数字字符,遇到下一次循环里面的scanf时,由于缓冲区内还有数据,所以不停下来,但还是原来的非数字字符不会从缓...

为什么输入字符会出现死循环?
由于定义了a是int类型,如果遇到cin不是int类型,则会出现异常,不会赋值给a,使其保持原值 你输入一个超出int类型的值,如5555555555555555555,也会出现上述情况。以下两种方法测试通过 解决方法一:用一char来排除非法字符 include<stdio.h> int main(){ int a;char b;while(1){ scanf("%d",&...

这个C语言程序输入字母会出现死循环,为什么?怎么办?
输入数据后,判断一下scanf函数的返回状态,返回0则读取失败。失败的原因有很多可能,比如你的这道例子,指定输入数字,但是却输入了字符,就会返回0,而且scanf不会有动作。由于num没有初始化,所以它是一个垃圾值,这就是死循环的原因。另外,如果想要输入指定字符退出的话,在多加一个判断即可。

关于一个c语言出现死循环的问题
但输入字母或符号后,scanf ("%d",a); 就不再能接收值了,因为必须与%d所控制的形式相对。但我认为不管怎么样也会有错误提示input error 的,出现死循环可能是前面scanf接收错误导致的。我建议改为:while (1){ int a,i;printf(" please enter a:\\n");do {i=scanf("%d",&a);getchar();...

这个程序为什么输入数字就是正常的,但输入一个字符就会陷入死循环!望...
在scanf("%d",&cn);的后面加上fflush(stdin);来清空输入缓存。否则每次scanf都会失败的。你没有判断scanf的返回值,如果判断了你会发现scanf每次都返回0,这是失败的。因为类型不匹配。因为scanf返回0,因此cn的值是堆栈中的随机值,所以很难等于3.--- 谁说fflush不是C标准来的?它的实现的确根...

C scanf不按格式输入的后果
scanf 返回成功读入的个数 ,如果读入整数过程中遇到字符 ,scanf 并不会处理这个字符 ,下次执行 scanf 会遇到同样的字符 ,你这输入字符以后 scanf 返回值为 0 ,陷入死循环 ,而且输入的字符无法得到处理,当然不能再输入

C语言中 while(scanf("%d",&a)!=1) printf("XXXX\/n"); 输入一个'q...
读取整数,q不是整数,q还在缓存中,下次读取又是q,如此无限循环了。如果类型正确会依次读取每个数。

相似回答