免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xiangfei108
打印 上一主题 下一主题

无意中发现的一个错误,请高手指点!!! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-05-03 11:20 |只看该作者
没想到啊,编程这么容易出错误,真是打击我的信心啊~~

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
12 [报告]
发表于 2007-05-03 11:20 |只看该作者
像这种短小的程序,当其行为和你预期的不同时,把你自己想像成计算机,把代码想像成对应的指令,自己把这段程序执行一下,你执行的结果和预期符合吗?

其实这种把自己想像成计算机的做法在于放慢你思考的速度,然后你就可以注意到许多以前你忽略了的细节;调试器的作用也是类似的。

论坛徽章:
0
13 [报告]
发表于 2007-05-03 11:20 |只看该作者
原帖由 葁子牙 于 2007-5-3 11:09 发表


84这个问题
4程序流程设计错误:em11:
米考虑到所有情况


我说的这个错误只是LZ问的其中一个问题.
而为什么说输入a后出现错误,那是因为scanf("%d",要求的是输入整型,而输入了字符型的,scanf()有返回值,在此时输入a的时候返回值为0,说明根本没有输入进去的.
而输入>100的时候无限循环那是正常的.

论坛徽章:
0
14 [报告]
发表于 2007-05-03 11:21 |只看该作者
原帖由 MMMIX 于 2007-5-3 11:20 发表
像这种短小的程序,当其行为和你预期的不同时,把你自己想像成计算机,把代码想像成对应的指令,自己把这段程序执行一下,你执行的结果和预期符合吗?

其实这种把自己想像成计算机的做法在于放慢你思考的速度,然后你就可以注意到许多以前你忽略了的细节;调试器的作用也是类似的。


闪之前拍照留念
DX94厉害哦 留个影 笑一个 田七

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
15 [报告]
发表于 2007-05-03 11:23 |只看该作者
原帖由 xiangfei108 于 2007-5-3 11:20 发表
没想到啊,编程这么容易出错误,真是打击我的信心啊~~

编程是个细致活,这点在你还没有养成细心的习惯之前尤其突出。

论坛徽章:
0
16 [报告]
发表于 2007-05-03 11:26 |只看该作者
原帖由 scutan 于 2007-5-3 11:20 发表


而为什么说输入a后出现错误,那是因为scanf("%d"),要求的是输入整型,而输入了字符型的,scanf()有返回值,在此时输入a的时候返回值为0,说明根本没有输入进去的



不好意思,我还是不明白。scanf一次调用不成功之后,就不能再次调用了吗?

我现在的问题是,输入a以后,程序一直不停的输出。说明程序一直循环,但是不会再次执行scanf。

[ 本帖最后由 xiangfei108 于 2007-5-3 11:31 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2007-05-03 12:54 |只看该作者
这是因为 scanf("%d", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致死循环。

解决方法:在 scanf 后加上这段代码

int c;
while ( (c = getchar()) != '\n' && c != EOF ) ;

[ 本帖最后由 antigloss 于 2007-5-3 12:56 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
18 [报告]
发表于 2007-05-03 13:24 |只看该作者
原帖由 antigloss 于 2007-5-3 12:54 发表
这是因为 scanf("%d", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是 ...

我觉得回复之前应该先验证一下,至少我验证的结果不是这样的。

当然,输入字母时其滞留在缓冲区中没有被第一个 scanf 读取是没错的,但要执行后续的 scanf,首先要判断 a 的值是否小于 100,而由于此时 a 并未被赋值(也未初始化),因此其中是一个随机值,例如在我执行时其中就是一个很大的整数,此时这才是导致程序进入死循环的原因。如果在定义 a 的同时(或者在第一个 scanf 之前)将其初始化为 0(或其他小于 100 的数字),那么在执行时第一次若输入字母,上述描述就适合了。

论坛徽章:
0
19 [报告]
发表于 2007-05-03 13:30 |只看该作者
原帖由 MMMIX 于 2007-5-3 13:24 发表

我觉得回复之前应该先验证一下,至少我验证的结果不是这样的。

当然,输入字母时其滞留在缓冲区中没有被第一个 scanf 读取是没错的,但要执行后续的 scanf,首先要判断 a 的值是否小于 100,而由于此时 a 并 ...

MMMIX 兄说的不错。不过我觉得LZ的主要问题在于缓冲区中有残留数据。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
20 [报告]
发表于 2007-05-03 13:46 |只看该作者
原帖由 antigloss 于 2007-5-3 13:30 发表

MMMIX 兄说的不错。不过我觉得LZ的主要问题在于缓冲区中有残留数据。

那段程序问题多了去了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP