鱼C论坛

 找回密码
 立即注册
查看: 1401|回复: 2

[已解决]do while语句为什么会出现这么奇怪的输出?

[复制链接]
发表于 2017-3-18 11:50:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h> 
{
        char c;
        do
        {
                printf("继续否(Y/N):");
                scanf("%c",&c);
        }while(c!='n'||c!='N');
        return 0;
}
RT,想编一个简单的程序,实现在运行完一次循环后提示“继续吗”,然后根据输入Y或N程序判断继续循环或者退出程序。但上面的程序运行结果如下:

1.png


这个结果表示很不理解 ??
为什么printf函数中的字符会输出两次??
为什么while语句没有进行判断??
这个结果意思就是进入死循环了

debug的时候发现一个奇怪的地方:
1.png

RT,第一次循环完成时c被赋值n,然后while没有进行判断直接进入第二次循环,而这个时候c值自动赋为图中所示的10''(Why???),然后自动进行第三次循环,所以导致输出结果一行中连续出现两次printf函数中的内容。

不知道是哪里出了问题,请各路大神不吝赐教!
最佳答案
2017-3-18 12:34:25
本帖最后由 Icetone 于 2017-3-18 13:20 编辑

你在第一次输完字符,输入流里面有:一个 y字符 加 一个换行符号
所以输入流中有两个字符,因此会循环两次;

× × 无限循环也就可以理解了,因为每次输入流中最后的字符都是 换行符   × × 错了这句话
无限循环是因为条件判断不对,(c!='n'||c!='N')的结果返回的是0或者1
当c=='n'的时候 (c!='n')== 0,(c!='N')== 1,所以整体结果为1,因此继续循环;c=='N'的时候同理。
条件改成 while (c != 'n' && c != 'N');

QQ截图20170318123129.png

如果我的表达用词不是太准确0.0,请指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-18 12:34:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Icetone 于 2017-3-18 13:20 编辑

你在第一次输完字符,输入流里面有:一个 y字符 加 一个换行符号
所以输入流中有两个字符,因此会循环两次;

× × 无限循环也就可以理解了,因为每次输入流中最后的字符都是 换行符   × × 错了这句话
无限循环是因为条件判断不对,(c!='n'||c!='N')的结果返回的是0或者1
当c=='n'的时候 (c!='n')== 0,(c!='N')== 1,所以整体结果为1,因此继续循环;c=='N'的时候同理。
条件改成 while (c != 'n' && c != 'N');

QQ截图20170318123129.png

如果我的表达用词不是太准确0.0,请指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-21 14:02:40 | 显示全部楼层
Icetone 发表于 2017-3-18 12:34
你在第一次输完字符,输入流里面有:一个 y字符 加 一个换行符号
所以输入流中有两个字符,因此会循环两次 ...

感谢解答!
这两天自己也在网上搜寻了解答,和你说的一致,原因就在于scanf函数会出现的“输入流缓冲区残余信息”问题!
关于这个问题的出现原因和解决办法我找到一个详细说明的链接(如下),共享给跟我一样遇到这个问题的初学者!
http://blog.sina.com.cn/s/blog_51409e8f01009han.html
再次感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-26 00:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表