| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 628 人关注过本帖
标题:新手求教个输入输出问题
只看楼主 加入收藏
lyanoa
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-7-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
新手求教个输入输出问题
int choose(int int);//这是输入个数字,如果数字在范围之类则返回该数字
void prin(void);//这是打印一行字的,没什么意义
int main()
{
    int min=1,max=4;
    int ch;
    prin();
    while((ch=choose(min,max))!=4){
        switch(ch)
        {
            case 1:.....
            ............
         }
     }
    return 0;
}
问题我感觉是主要下面这个函数:
int choose(int m,int n)
{
    int ch;
    if(scanf("%d",&ch)!=1){
       while(ch<m||ch>n){
         prin();
         getchar();
         scanf("%d",&ch);
       }
     }
     return ch;
}
这是我后面改的能运行的,我乱搞的,不过我不能理解,请大家指点下,先谢谢了!!
1:为什么要加个getchar(),不加会死循环,不停的输出prin()(当你输入字母的时候),我知道是scanf()不读换行和回车,和getchar()一起回有问题,
   不过我我自始至终也没用getchar(),不懂
2:我开始是把scanf(“%d",&ch)并到while()里面的,而且我也加了getchar(),但是在运行的时候,先输入字母后,要连续输入2次数字才有反应,这是什么回事?
(问题1在2中也是一样,不加getcgar(),也会死循环)
搜索更多相关主题的帖子: 输出 输入 
2009-07-18 15:23
嬿·嘄·骊·戨
Rank: 2
来 自:天府之国
等 级:论坛游民
帖 子:84
专家分:25
注 册:2008-10-16
收藏
得分:20 
当你输入非整数数据时  
if(scanf("%d",&ch)!=1)  此条件回成立  
而这个时候``输入的非法数据不回被读取```还留在输入缓冲里面``
然后开始循环了``
CH读如不成功```数值是随机的和MN比较``ch<m||ch>n 的可能性很大``
然后开始循环体```如果没有getchar``那么就是 scanf("%d",&ch)
这个时候读取的数据是上次没读取成功留在缓冲区的数据```
因为是非法的数据``所以又读取失败``次数据又留在缓冲区```
而CH的值不变```所以循环再次成立```然后又开始读取那个非法数据``
然后死循环就产生了``


加了getchar```就把那个非法的数据接受了``但是只能接受一个字符``输入超过几个就的加几个getchar

这样麻烦```所以可以自己写个代码块  

#define CLS_IO { int c; while( ( c=getchar() )!='\n'|| c!=EOF ); }

用来清空输入缓冲区
2009-07-18 16:02
lyanoa
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-7-16
收藏
得分:0 
哦,谢谢,意思是scanf()读取错误,数据还留在缓冲区,以后的scanf()还是读的原来那个数据。
那第2个问题呢,能不能把if(scanf("%d",&ch)并到while()条件里面,我并过,能行,就是会产生相应问题:比如,输入q,就会调用prin(),这没问题。然后重新输入,问题就来了,比如输入1,没反应,再输入1,就能顺利运行了。也就是说每次错误输入调用prin()后,都要连续连续输入2次正确的,才能运行,第一次正确输入是无效的,这是什么原因,麻烦再帮我解释下。谢谢了(里面也加了getchar())
2009-07-18 16:33
mfh
Rank: 6Rank: 6
等 级:侠之大者
帖 子:179
专家分:411
注 册:2009-5-31
收藏
得分:0 
在进行SCANF()函数后最好用fflush(stdin)对缓冲区进行清空!!!!
2009-07-18 16:39
嬿·嘄·骊·戨
Rank: 2
来 自:天府之国
等 级:论坛游民
帖 子:84
专家分:25
注 册:2008-10-16
收藏
得分:0 
第二个问题``代码是这样的?

while( scanf("%d",&ch)!=1  || (ch<m||ch>n ) )
{
         prin();
         getchar();
         scanf("%d",&ch);
       }
}
如果是这样就好解释  

输入的非法数据被getchar接受`` 然后就是scanf读取一个数``读取完后``
再进入循环``while里又有scanf```所以再读取一次``就2次了``
2009-07-20 03:13
lyanoa
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-7-16
收藏
得分:0 
谢谢,楼上几位,问题解决了,2楼跟5楼的是正解,名字有点复杂,不太认识,好吧,我承认我是文盲!再次谢谢!
2009-07-29 00:10
xiaoyuer110
Rank: 2
等 级:论坛游民
帖 子:37
专家分:17
注 册:2009-7-29
收藏
得分:0 
呵呵!伙计!加油了!细心点问题少一点!

除学者!不是败给程序不懂!而是编的时候不够心细!
2009-07-29 01:10
快速回复:新手求教个输入输出问题
数据加载中...
 
   



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

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