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和提示文字,这时候才结束
展开
 我来答
mlymly2008
2016-04-30 · TA获得超过724个赞
知道小有建树答主
回答量:667
采纳率:100%
帮助的人:235万
展开全部

先给出一种解决方案吧,在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++运算符重载的问题,比较复杂可以慢慢研究一下哈~
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ilvwhy
2016-04-30 · TA获得超过1.3万个赞
知道大有可为答主
回答量:1.7万
采纳率:81%
帮助的人:2741万
展开全部

因为你是先计算平方根在判断输入的值,所以提示文字会输入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;
}


以上的代码还不完善,只是针对你的问题做了修改。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
黄浦数学老师
2016-04-30 · TA获得超过3892个赞
知道小有建树答主
回答量:4965
采纳率:0%
帮助的人:989万
展开全部
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;
}
}

如果不懂欢迎提问!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_归邪丶
2016-04-30 · TA获得超过106个赞
知道小有建树答主
回答量:184
采纳率:0%
帮助的人:88.2万
展开全部
改成while循环试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式