免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3419 | 回复: 10
打印 上一主题 下一主题

[C] 这个死循环是怎么出现的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-23 16:18 |只看该作者 |倒序浏览
$cat -n foo.c

     1  #include <stdio.h>
     2
     3  main()
     4  {
     5      int i;
     6
     7  CHOICE:
     8      printf("\r\nPlz input an interger number: \r\n");
     9      scanf("%d", &i);
    10
    11      if (i < 1 || i > 100) {
    12          printf("\r\nERROR: Your choice must be between 1 to 100!\n");
    13          goto CHOICE;
    14      }
    15
    16      printf("\r\nINFO: Your choice is %d!\n", i);
    17
    18  }


假入我输入数字回车,比如“1↓”,则正常。
假入我输入一个字母回车,比如“a↓”,则会陷入死循环。
请教这个死循环的根本原因是什么?
我试了一下只要输入字母就会出问题,而在第9句scanf后面加一句getchar就没问题。
我起初怀疑是scanf没清缓冲区的原因,可是在scanf后加上fflush(stdin)也没用还是死循环。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
2 [报告]
发表于 2009-03-23 16:26 |只看该作者
为何不怀疑下你自己?

跟踪下,看看i的值在每一步中都是什么;在什么情况下有变化,什么情况下不会变;再查查scanf的说明,想想为什么。

论坛徽章:
0
3 [报告]
发表于 2009-03-23 16:29 |只看该作者
我发现最近代码里有goto的不少。。。开始流行了又?

论坛徽章:
0
4 [报告]
发表于 2009-03-23 16:39 |只看该作者

回复 #2 shan_ghost 的帖子

死循环的时候i的值是14176244,scanf的返回值是0,scanf失败
但是我没想明白为什么scanf会失败,而且会陷入死循环?

论坛徽章:
0
5 [报告]
发表于 2009-03-23 17:02 |只看该作者
你认真了解过 scanf 的作用么。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
6 [报告]
发表于 2009-03-23 17:03 |只看该作者
1、scanf为何会失败?

2、scanf失败后i的值是什么?

3、自己查文档,看看scanf在你这种应用场合下会怎么做。

论坛徽章:
0
7 [报告]
发表于 2009-03-23 18:57 |只看该作者
原帖由 flyhighxu 于 2009-3-23 16:18 发表
$cat -n foo.c

     1  #include
     2
     3  main()
     4  {
     5      int i;
     6
     7  CHOICE:
     8      printf("\r\nPlz input an interger number: \r\n");
     9      scan ...

scanf是从你的输入缓存里面取东西。
1.缓存里面没有东西,命令行阻塞,你输入直到回车,输入的东西都放到缓存里面。
2.然后scanf才去缓存里面取东西,做类型转换

3.如果scanf失败了,在很多实现下,缓存的内容仍然在那里,你下一次scanf调用的时候,因为有东西,所有并不需要读取命令行输入,而是从已经有的缓存里面去取,所以就陷入了不需要输入的scanf不停读取->失败->读取。

论坛徽章:
0
8 [报告]
发表于 2009-03-23 21:13 |只看该作者
原帖由 jeanlove 于 2009-3-23 18:57 发表

scanf是从你的输入缓存里面取东西。
1.缓存里面没有东西,命令行阻塞,你输入直到回车,输入的东西都放到缓存里面。
2.然后scanf才去缓存里面取东西,做类型转换

3.如果scanf失败了,在很多实现下,缓存 ...



谢谢,不过为什么加上一句fflush(stdin)来清缓存也不行呢?现在是用getchar()才行。

论坛徽章:
0
9 [报告]
发表于 2009-03-23 22:02 |只看该作者
没有看代码逻辑

但是scanf没有处理输入中的回车是很明显的问题

论坛徽章:
0
10 [报告]
发表于 2009-03-24 11:16 |只看该作者
假如 scanf 失败,i 的值是不确定的吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP