c语言的问题关于while(scanf(“%d",&sum)!=1)

程序
int main(void)
{
int sum;
while(scanf(“%d",&sum)!=1)
printf("ABC\n");
return 0;
}
运行后输入字符a,为什么会一直重复输出ABC
而把循环改成while(scanf(“%d",&sum)==1)
输入数字只输出一次ABC

三点:

    scanf从缓冲区读取:你输入的字符串会保存在一个缓冲区内,scanf在正确的时候是到这个缓冲区中读取字符,并且从缓冲区中删除字符。但如果是%d格式碰到了字母,则不会读取也不会删除,之后ABC还在缓冲区内。

    scanf不停止:如果缓冲区内有内容,scanf是不会停下来等你输入的,因为ABC一直在缓冲区内,所以造成了一直不停重复循环。

    scanf的返回值:scanf如果成功返回的是输入的个数,当你输入ABC的时候,scanf失败,返回0,则条件一直成立,所以造成了死循环

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-28
scanf()的返回值说明如下:
This functions return the number of input items successfully matched and assigned, which can be fewer than provided for, or even zero in the event of an early matching failure.

大致意思是说返回正确匹配的输入项个数,比如你用%d,那输入数字才是正确匹配,你输入字母a就匹配不上,所以while里的scanf()返回0,while条件为真,到下一次判断时由于上一次输入不匹配,输入缓冲区中的字母a并没有被取走,所以这一次循环还是和上一次一样。如此,死循环。

你把while改了后输入数字,那scanf返回值为1,while条件为真,执行循环内容。下一次循环输入缓冲区的内容已经被上一次取走,这时就继续等待输入。
第2个回答  2013-11-28
scanf返回成功项的个数,就比如说scanf("%d",&n)则成功后返回值为1,scanf("%d%d",&n,&m)成功则返回值为2.你在理解下