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

用scanf循环输入整数的时候当输一个字符就死循环!该如何解决

2012-09-17 
用scanf循环输入整数的时候当输一个字符就死循环!!while(1){scanf(%d,a)}当我输入一个字符时就会死循环

用scanf循环输入整数的时候当输一个字符就死循环!!
while(1)
{
  scanf("%d",a);
}
当我输入一个字符时就会死循环,如果在scanf后面加一个getchar();就好了,但是我不明白为什么。
求高人;

[解决办法]
因为你要读取的是数字,输入一个字符时, scanf函数会失败,但是这个字符还在流里面没有被读出来,所以就死循环动不了了;而getchar()函数是读字符的,scanf函数失败,但是字符会被getchar()函数从流里面读出来。其实不管哪一种情况都是死循环的,只是表现不一样而已,第二种情况只是你还能输入东西罢了。
[解决办法]
亲,scanf中第二个参数要求时地址,看你前面是%d,那么很明显应该这么写scanf(“%d”,&a);至于后面的getchar是吧你没有读进去的字符读到了getchar里面,所以过去了,并且你这本身就是个死循环啊
[解决办法]
因为你要读取的是数字,输入一个字符时, scanf函数会失败,但是这个字符还在流里面没有被读出来,所以就死循环动不了了;而getchar()函数是读字符的,scanf函数失败,但是字符会被getchar()函数从流里面读出来。其实不管哪一种情况都是死循环的,只是表现不一样而已,第二种情况只是你还能输入东西罢了。
[解决办法]
亲,scanf中第二个参数要求时地址,看你前面是%d,那么很明显应该这么写scanf(“%d”,&a);至于后面的getchar是吧你没有读进去的字符读到了getchar里面,所以过去了,并且你这本身就是个死循环啊
[解决办法]
都没有退出循环的条件,显然是死循环
[解决办法]
1楼正解!
[解决办法]
你加了getchar()同样是死循环,只不过是getchar()能让屏幕停顿让你产生这种感觉而已
[解决办法]
1,3楼正解。
[解决办法]
人家的意思就是那样的,1楼已经说得很清楚了。你输入的字符进入了输入流,scanf如果输入不匹配的话,是不会把那个字符取走的,所以下次scanf还会遇到那个字符,getchar的作用就是把它拿走。

fflush(stdin);这个是未定义行为,C标准没有规定stdin能够用fflush清空。VC上可以、TC上可以那个是编译器扩展,GCC就不行。
标准的清空输入缓存的方法是:
int c;
while ( (c = getchar()) != '\n' && c != EOF ) ;
或者
scanf(" %c",&a);
把这个放在scanf前面就行了。
[解决办法]

C/C++ code
#include <stdio.h>char s[]="123 ab 4";char *p;int v,n,k;void main() {    p=s;    while (1) {        k=sscanf(p,"%d%n",&v,&n);        printf("k,v,n=%d,%d,%d\n",k,v,n);        if (1==k) {            p+=n;        } else if (0==k) {            printf("skip char[%c]\n",p[0]);            p++;        } else {//EOF==k            break;        }    }    printf("End.\n");}//k,v,n=1,123,3//k,v,n=0,123,3//skip char[ ]//k,v,n=0,123,3//skip char[a]//k,v,n=0,123,3//skip char[b]//k,v,n=1,4,2//k,v,n=-1,4,2//End.
[解决办法]
讲的很好我就不废话了
[解决办法]
lz是故意不写&这个符号的吧
[解决办法]
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

热点排行