C语言关于while循环的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言关于while循环的问题相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
int main(void)

long num;
long sum=0L;
int status;
printf("Please enter an integer to be summed.");
printf("(q to quit!)");
status=scanf("%ld",&num);
while(status!=1)

sum=sum+num;
printf("Please enter next integer(q to quit):");
status=scanf("%ld",&num);


printf("Those integer sum to %ld.\n",sum);
return 0;

我想问的是:
while的判断条件为status!=1时,为什么输入字母如 a,q,w,t时会陷入无限循环?
当scanf()未能够读取指定形式的输入时,它就会留下这个不相容的输入,以供下次进行读取。当我输入字母时它就会保留字母所以会出现无限循环。
这个就是问题的答案,我对百度知道失望了,谢谢下面两位,这个是我找到的答案

参考技术A 你看你有一行是
long num;
这行说的是num是一个长整形变量。
然后你用scanf赋值,你赋的'a','b'这样的字符。
这导致scanf函数的输入错误。返回0
0有付给啦status。0!=1当然是正确的所以继续循环。
\微笑追问

我已经在上面发过答案了
我大概知道是怎么回事了
另外我也知道肯定输入字母如a,b是错误的,scanf()会返回0
然后在while里面循环
但是无限循环的根本原因是scanf在错误输入后会保留原输入字符
所以字母会继续进入循环导致无限循环,就酱

追答

我懂你的意思,你看第一个输入,你输入的status=scanf("%ld",&num);
这时候

我懂你的意思,你看第一个输入,你输入的status=scanf("%ld",&num);
这时候你输入的是a,那么你也知道错啦,这时候系统默认你已经输出啦,在输入流中,后面继续进行,又到啦循环里的status=scanf("%ld",&num);这时候系统从输入流中调入你输入的a,还是错的,呢么每次都循环,每次都错。所以无限循环,你可以在scanf后面加一个
fflush(stdin); // 清除输入流

这样就可以继续输入啦
\微笑

参考技术B 你只有输入一个ASCII码值为1的才会结束循环,你的status!=1这样的条件设置有问题,并且你循环体中和循环体外面的:status=scanf("%ld",&num); 语句有问题,格式输入函数没有返回值吧。 参考技术C scanf()函数返回的值为:正确按指定格式输入变量的个数;
因为输入字母时,就没有正确输入指定格式的变量,返回值为0,而0!=1永远成立,所以陷入无限循环追问

如果你这么解释,那么while的条件为status==1时为什么不会陷入无限循环?

追答

0==1不会成立啊,就不会进去循环了。
你将status的值printf出来看一下就清楚了哦。

C语言循环问题

对下面这一段看不太懂,求解释
int sum=1000;
while(sum)

switch(sign)

case 'a':
case 'A':arrive(&st1,&p,a);break;
case 'b':
case 'B':leave(&st1,&st2,&p,a);break;
case 'c':
case 'C':exit(OVERFLOW);break;

printf("\n请输入A/B/C 和 车牌号:");
scanf("%c %d",&sign,&a.car_num);
getchar();
sum--;

参考技术A 这是一个循环,根据sign值来看,要循环1000次
switch(sign)



提示你输入选择的字母和车牌号:
printf("\n请输入A/B/C 和 车牌号:");
scanf("%c %d",&sign,&a.car_num);

根据你输入的内容,做出相应的处理反应:
switch(sign)

case 'a':
case 'A':arrive(&st1,&p,a);break;
case 'b':
case 'B':leave(&st1,&st2,&p,a);break;
case 'c':
case 'C':exit(OVERFLOW);break;
参考技术B 嵌套循环
外层循环是:
while(sum)
sum--;

直到sum=0为止,跳出循环
内层循环:
switch(sign)
......
当scanf("%c %d",&sign,&a.car_num); //输入内容
getchar(); //获取输入的字符
输入的sign值为a或A时,执行arrive(&st1,&p,a);break; 这两句语句
输入的sign值为b或B时,执行leave(&st1,&st2,&p,a);break; 这两句语句
输入的sign值为c或C时,执行exit(OVERFLOW);break; 这两句语句本回答被提问者采纳
参考技术C 应该是个汽车监控系统吧,输入a,车牌号1代表车牌号1的车来了,输入b,车牌号2代表车牌号2的车走了,输入c,车牌号表示超载了,就是堵车了.记录1000次 参考技术D 对循环部分可以抽出来
int sum = 1000;
while(sum)

sum--;


意思就是sum是循环次数,每次循环减一,直到sum为0 为止
一共循环了1000次
第5个回答  2013-06-27 这上一人循环嵌套语句,

以上是关于C语言关于while循环的问题的主要内容,如果未能解决你的问题,请参考以下文章

请教C语言中while循环的问题,谢谢!

C语言不定长参数的问题

C语言 do while 和 while 循环

c语言无限循环while和for(;;)的区别

用c语言while循环结构算学生成绩

关于IO流中下while循环句解释:while ((len=fr.read(c))!=-1)