for循环中条件不符为何不立刻退出?
for(;a==1;){printf("Input:");scanf("%d",&c);m=square(c);printf("%f\nAnothertry.Toexit...
for (;a == 1;)
{
printf("Input:");
scanf("%d", &c);
m = square(c);
printf("%f\nAnother try.To exit, press N.\n", m);
scanf("%c", &b);
switch(b)
{
case'N':case'n': a = 0;break;
}
}
开根程序,第一次输入5,输出2.XXXXXX,然后是提示文字,再输入N,为何不立刻退出循环?而是又显示了一遍2.XXXXXX和提示文字,这时候才结束 展开
{
printf("Input:");
scanf("%d", &c);
m = square(c);
printf("%f\nAnother try.To exit, press N.\n", m);
scanf("%c", &b);
switch(b)
{
case'N':case'n': a = 0;break;
}
}
开根程序,第一次输入5,输出2.XXXXXX,然后是提示文字,再输入N,为何不立刻退出循环?而是又显示了一遍2.XXXXXX和提示文字,这时候才结束 展开
4个回答
展开全部
先给出一种解决方案吧,在scanf("%d",&c);后面一行加上getchar();语句用来接收输入数字以后的回车字符,模拟了一下代码,效果如下:
1.代码图
PS:printf("Look! %d\n",ch);被我注释了
2.运行效果图
3.推测原因:
代码中连续使用两个scanf导致的,当输入5并按下回车之后,b已经被赋值成回车符了(检测到ASCII码为10),所以在switch判断逻辑当中case条件不成立,进入下一次循环,程序会显示“input”,当再次输入N or n后,由于类型检测,N or n 不会赋值给c,而是赋值给了b,此时c的值仍然是上一次执行逻辑中输入的5,但是b被赋值为了N or n,case判断条件成立,退出循环。
模拟BUG代码如下:
运行情况就是这样:
也是题主的情况。
可能是scanf函数的输入类型重载导致的原因,可以分析一下scanf函数的源码找到哈~
追问
确实是这个问题,用fflush(stdin)也能解决。还有个问题是c中可以用=给float和double类型赋值,为什么用c++时无法用赋值运算符给double类型赋值?输出是0.000000
追答
这个涉及到C++运算符重载的问题,比较复杂可以慢慢研究一下哈~
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为你是先计算平方根在判断输入的值,所以提示文字会输入2遍。
要输入N立刻退出,应该把case判断放到sqrt之前。
int main()
{
int a=1,c;
double m;
printf("Input:");
scanf("%d", &c);
for (; a == 1;)
{
switch(c)
{
case'N':
case'n':
//a = 0;
return 0;
}
m = sqrt(c);
fflush(stdin);
printf("%f\nAnother try.To exit, press N.\n", m);
scanf("%c", &c);
}
return 0;
}
以上的代码还不完善,只是针对你的问题做了修改。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
for (;a == 1;)
{
printf("Input:");
scanf("%d",&c);
m = c;
printf("%f\nAnother try.To exit, press N.\n", m);
while ( (c=getchar()) != '\n' && c != EOF ) { ; } //清空输入缓冲区的所有残留字符
scanf("%c",&b);
switch(b)
{
case'N':case'n': a = 0;break;
}
}
如果不懂欢迎提问!!
{
printf("Input:");
scanf("%d",&c);
m = c;
printf("%f\nAnother try.To exit, press N.\n", m);
while ( (c=getchar()) != '\n' && c != EOF ) { ; } //清空输入缓冲区的所有残留字符
scanf("%c",&b);
switch(b)
{
case'N':case'n': a = 0;break;
}
}
如果不懂欢迎提问!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
改成while循环试试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询