用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代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。