首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

为什么输入非数字之后,会成死循环?解决办法

2012-04-15 
为什么输入非数字之后,会成死循环?我写了一个小程序,想实现syetem(pause)这个函数的功能,用了一个循环,

为什么输入非数字之后,会成死循环?
我写了一个小程序,想实现syetem("pause");这个函数的功能,用了一个循环,怎么输入非数字之后,会成死循环?
代码如下:

#include<stdio.h>

int main()
{
 int i, j, k;
 int e=3;
 
 for(;;)
 { 
 printf("i j k\n");
 for (i=0; i<2; i++)
  for(j=0; j<2; j++)
  for(k=0; k<2; k++)
  printf("%d,%d,%d\n", i, j, k);

 printf("please enter the value of e:\n");
 scanf("%d",&e);
 if(e==0) 
 break;
 }
 return 0;
}

[解决办法]
在于if(e==0),你输入非数字,其实输入的是ASCII码,自然不满足条件,所以就会一直循环咯。
[解决办法]
%d要求int型,因为输入错误导致转换失败,输入流利的数据没有清空,所以第二次循环到scanf函数的时候不需要等待再次输入,他会重新扫描输入流利你输入的字母,所以再次转换失败,于是循环继续,所以变成了死循环。
[解决办法]

探讨
%d要求int型,因为输入错误导致转换失败,输入流里的数据没有清空,所以第二次循环到scanf函数的时候不需要等待再次输入,他会重新扫描输入流里你输入的字母,所以再次转换失败,于是循环继续,所以变成了死循环。

[解决办法]
输入缓冲区数据残留。。。。改成下面的
C/C++ code
        fflush(stdin);//在scanf前边加个        scanf("%d",&e);
[解决办法]
http://wenku.baidu.com/view/7c46430c6c85ec3a87c2c57c.html
建议也看看这个吧···
虽然有时fflush(stdin)可以解决问题···
不过跟平台也有关系···
探讨

输入缓冲区数据残留。。。。改成下面的
C/C++ code
fflush(stdin);//在scanf前边加个
scanf("%d",&amp;e);

[解决办法]
楼上已经给出正确的解释了!
[解决办法]
scanf("%d",&e);//遇到这条语句时,如果输入的是非数字,则不从缓冲区里读取任何内容,当然e不会被初始化,则其未必是0;
所以遇到下面的条件不会退出
if(e==0)
 break;

//修改如下
C/C++ code
#include<stdio.h>int main(){    int i, j, k;    int e=3;        for(;;)    {          printf("i j k\n");        for (i=0; i<2; i++)            for(j=0; j<2; j++)                for(k=0; k<2; k++)                    printf("%d,%d,%d\n", i, j, k);                                printf("please enter the value of e:\n");                int count=scanf("%d",&e);//count用于测试是否正常读入内容                if(e==0||count!=0)                      break;    }    return 0;}
[解决办法]
scanf("%d",&e); 当程序发现你的输入与 "%d"不匹配时,他会将不合要求的字符退回,然后继续等待,直到有一个合适的或你终止 scan()功能
[解决办法]
这是由于“输入缓冲区有数据残留”导致的。比如输入字母:a,scanf("%d",&e);只接受整数类型,于是a被放回输入缓冲区,下次scanf函数执行时,由于输入缓冲区有数据,它会直接去缓冲区读取,但读取到的还是字母,于是又放回,如此反复。

所以解决办法就是在scanf之后清除输入缓冲区。

方法一: 如5楼,可以用fflush(stdin);,不过这可能不属于c标准做法,而是vc编译器的扩展,所以可能对其它编译器不灵。
C/C++ code
#include<stdio.h>int main(){    int i, j, k;    int e = 3;    for(;;)    {          printf("i j k\n");        for (i=0; i<2; i++)            for(j=0; j<2; j++)                for(k=0; k<2; k++)                    printf("%d,%d,%d\n", i, j, k);        printf("please enter the value of e:\n");        scanf("%d",&e);        if(e==0)              break;        fflush(stdin);            }    return 0;}
------解决方案--------------------


请检查scanf的返回值。
[解决办法]
rewind(stdin);
or
stdin-_cnt=0;

热点排行