| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2179 人关注过本帖
标题:死循环问题
只看楼主 加入收藏
kettle99
Rank: 2
等 级:论坛游民
帖 子:52
专家分:54
注 册:2010-5-25
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:14 
死循环问题
main()
{
    int number;
    printf("choose a number from 1,2,3:");
    scanf("%d",&number);
    while(number!=1&&number!=2&&number!=3)
    {
        printf("input error, pls input again");
        scanf("%d",&number);
    }
 }

程序是为了实现输入1.2.3其中的一个数字,如果输入其他字符则要求重新输入。

运行结果:

1、当输入1、2、3时正常。
2、当输入7、8、9时也能正常提示input error, pls input again,并能再次输入
3、当输入字母时(比如u),则陷入死循环,一直输出input error, pls input again
搜索更多相关主题的帖子: 字母 number 
2010-06-05 17:52
gaoce227
Rank: 4
来 自:山东
等 级:业余侠客
帖 子:134
专家分:218
注 册:2008-4-5
收藏
得分:0 
1.为什么会进入死循环?
2.在while语句前加入if判断行吗?有点繁琐了。
2010-06-05 18:00
kettle99
Rank: 2
等 级:论坛游民
帖 子:52
专家分:54
注 册:2010-5-25
收藏
得分:0 
以下是引用gaoce227在2010-6-5 18:00:28的发言:

1.为什么会进入死循环?
2.在while语句前加入if判断行吗?有点繁琐了。
1、我问的就是为什么陷入死循环,输入7、9等数字为什么不陷入死循环?

2、这跟加IF没有关系。就算是加个判断有何用?如果我不用WHILE那么如果一直输入错误,我怎么提示重新输入?


不太明白你的意思,你写个代码,我试试呵呵

[ 本帖最后由 kettle99 于 2010-6-5 18:52 编辑 ]
2010-06-05 18:49
gaoce227
Rank: 4
来 自:山东
等 级:业余侠客
帖 子:134
专家分:218
注 册:2008-4-5
收藏
得分:5 
https://bbs.bccn.net/thread-304769-1-1.html

你看看这个题,和你的有关系吗?

至于这个死循环,这样解释行不?
scanf是从你的输入缓存里面取东西。
1.缓存里面没有东西,命令行阻塞,你输入直到回车,输入的东西都放到缓存里面;
2.然后scanf才去缓存里面取东西,做类型转换;
3.如果scanf失败了,在很多实现下,缓存的内容仍然在那里,你下一次scanf调用的时候,因为有东西,所有并不需要读取命令行输入,而是从已经有的缓存里面去取,所以就陷入了不需要输入的scanf不停读取->失败->读取。

[ 本帖最后由 gaoce227 于 2010-6-5 19:23 编辑 ]
2010-06-05 19:15
wibx化吉
Rank: 2
等 级:论坛游民
帖 子:10
专家分:10
注 册:2010-6-3
收藏
得分:0 
你定义的number是整型
输入字符应该就会出错吧
我也不太懂,看看这个,可以的
#include <stdio.h>
main()
{
    int number;
    scanf("%d",&number);
    while(number<1||number>3)                             
    {
         printf("input error, pls input again\n");
         getchar();  //加个这个就可以了吧
         scanf("%d",&number);
     }
}
2010-06-05 19:32
kettle99
Rank: 2
等 级:论坛游民
帖 子:52
专家分:54
注 册:2010-5-25
收藏
得分:0 
以下是引用gaoce227在2010-6-5 19:15:28的发言:

https://bbs.bccn.net/thread-304769-1-1.html

你看看这个题,和你的有关系吗?

至于这个死循环,这样解释行不?
scanf是从你的输入缓存里面取东西。
1.缓存里面没有东西,命令行阻塞,你输入直到回车,输入的东西都放到缓存里面;
2.然后scanf才去缓存里面取东西,做类型转换;
3.如果scanf失败了,在很多实现下,缓存的内容仍然在那里,你下一次scanf调用的时候,因为有东西,所有并不需要读取命令行输入,而是从已经有的缓存里面去取,所以就陷入了不需要输入的scanf不停读取->失败->读取。
看那个帖子了,跟我的问题一样,那个帖子问题没解决

不过你解释的不错,能讲得通

但是为什么输入7的时候缓存会清,而输入u时缓存里一直有东西啊?

[ 本帖最后由 kettle99 于 2010-6-5 19:37 编辑 ]
2010-06-05 19:35
kettle99
Rank: 2
等 级:论坛游民
帖 子:52
专家分:54
注 册:2010-5-25
收藏
得分:0 
以下是引用wibx化吉在2010-6-5 19:32:38的发言:

你定义的number是整型
输入字符应该就会出错吧
我也不太懂,看看这个,可以的
#include
main()
{
    int number;
    scanf("%d",&number);
    while(number<1||number>3)                             
    {
         printf("input error, pls input again\n");
         getchar();  //加个这个就可以了吧
         scanf("%d",&number);
     }
}
谢谢你

我是想知道为什么出这种情况
2010-06-05 19:38
雨枫
Rank: 2
等 级:论坛游民
帖 子:3
专家分:10
注 册:2010-6-4
收藏
得分:5 
黑無止境()  20:34:51
缓冲输入区没刷新的问题
一休()  20:35:27
没刷新?那为什么当输入7、8、9时也能正常提示input error, pls input again,并能再次输入

黑無止境()  20:35:59
可是你输入的是字符
黑無止境()  20:36:25
而你接受的是%D
一休)  20:37:31
那么如接受的是%C,而输入的是2.3,那么也要刷新
黑無止境()  20:37:40
这个会导致字符停留在输入缓冲区,下次遇到scanf();时会直接从缓冲区拿,所以就导致无限循环

一休(  20:38:15
哦,
一休( 20:38:45
那要怎么刷新呢
dwboy()  20:39:18
1、限制scanf输入长度
2、刷心缓冲区
黑無止境(  20:39:30
fflush <stdio.h> ANSI, Win 95, Win NT
黑無止境 20:39:44
fflush 刷新缓冲区的

2010-06-05 20:41
wibx化吉
Rank: 2
等 级:论坛游民
帖 子:10
专家分:10
注 册:2010-6-3
收藏
得分:0 
#include <stdio.h>
main()
{
    int number;
    scanf("%d",&number);
    while(number<1||number>3)                             
    {
         printf("input error, pls input again\n");
         getchar();  //加个这个就可以了吧
         scanf("%d",&number);
     }
}
等待高手回答啊
为什么要加getchar()
不加getchar()出现死循环
 
2010-06-05 21:17
u2jrmao
Rank: 2
等 级:论坛游民
帖 子:20
专家分:11
注 册:2010-3-25
收藏
得分:0 
参考参考
2010-06-05 22:37
快速回复:死循环问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018559 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved