| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 426 人关注过本帖
标题:请帮忙看下这个循环为什么第一次正常,第二次不正常?
收藏  订阅  推荐  打印 
humanpaladin
Rank: 1
等级:新手上路
帖子:3
积分:130
注册:2008-8-17
请帮忙看下这个循环为什么第一次正常,第二次不正常?

代码如下:
#include<stdio.h>
int main(){
    char operation;
    
    while(1){
    printf("Enter the operation you want:");
    operation=fgetc(stdin);
        
    if(operation=='q')
        break;
    switch(operation){
        case 'I':
                 printf("I\n");
            break;
        case 'i':
            printf("i\n");
            break;
        default:
            printf("Wrong input,Retry\n");
    }    
    }    
    return(0);
}
运行时的现象是:
首先提示"Enter the operation you want:"
输入I,然后会打印出来I,
完了之后继续提示"Enter the operation you want:"
可是问题出现,这时候不需要输入,上面的提示语后显示"Wrong input,Retry"。
用Turbo c的watch功能显示出operation在此时已经为"\n".不知道这个"\n"是什么时候引入的?

[ 本帖最后由 humanpaladin 于 2008-8-17 16:53 编辑 ]
搜索更多相关主题的帖子: operation  printf  break  want  case  
2008-8-17 16:51
独孤小梦
Rank: 3Rank: 3
等级:中级会员
帖子:255
积分:2958
注册:2008-6-5

#include<stdio.h>
int main()
{
    char operation;
    while(1)
    {
        printf("Enter the operation you want:\n");
        scanf("%s",&operation);
        if(operation=='q')break;
        switch(operation)
        {
        case'I': printf("I\n");break;
        case'i': printf("i\n");break;
        default: printf("Wrong input,Retry\n");
        }   
    }
    return(0);
}

编程小菜
2008-8-17 17:46
独孤小梦
Rank: 3Rank: 3
等级:中级会员
帖子:255
积分:2958
注册:2008-6-5

你的程序错误错在operation=fgetc(stdin);这里,使用FGETC函数是文件输入函数,你这个程序建议使用SCANF函数。
我觉得你的那个函数不合适出现在这样的程序里!如果有必要使用,那么请看下那个函数的用法!
我也是小菜,有什么不对,希望大家指教,谢谢!

[ 本帖最后由 独孤小梦 于 2008-8-17 17:50 编辑 ]

编程小菜
2008-8-17 17:47
csynyk
Rank: 2
等级:注册会员
威望:1
帖子:114
积分:1460
注册:2008-8-9

operation=fgetc(stdin);
    这句执行完毕后,回车符还留在stdin中没有被取出来,此时stdin非空,所以fgetc(stdin),会继续执行!直到stdin空为止。你可以在不改变上述代码的情况下一次多输入几个字符来验证一下!
   要杜绝这种情况很容易,在执行operation=fgetc(stdin);执行一句fflush(stdin);来清空stdin就行了!

http://blog.csdn.net/csynyk
2008-8-17 17:49
独孤小梦
Rank: 3Rank: 3
等级:中级会员
帖子:255
积分:2958
注册:2008-6-5

呵呵,LS正解!

编程小菜
2008-8-17 17:52
HERO剧终
Rank: 2
来自:深圳
等级:注册会员
帖子:154
积分:1700
注册:2008-8-11

   决定了,开始学习C语言了

水因有月方知静,天为无云始觉高
2008-8-17 18:20
humanpaladin
Rank: 1
等级:新手上路
帖子:3
积分:130
注册:2008-8-17

csynyk 在 2008-8-17 17:49 的发言:

operation=fgetc(stdin);
    这句执行完毕后,回车符还留在stdin中没有被取出来,此时stdin非空,所以fgetc(stdin),会继续执行!直到stdin空为止。你可以在不改变上述代码的情况下一次多输入几个字符来验证一下! ...
谢谢这位大哥,你的话让我茅塞顿开,我很感动。。。
2008-8-17 18:45
humanpaladin
Rank: 1
等级:新手上路
帖子:3
积分:130
注册:2008-8-17

也谢谢独孤小梦兄。
2008-8-17 18:47
爱喝牛奶的猫咪
Rank: 2
来自:QQ群46520219
等级:ID已被封
帖子:514
积分:5824
注册:2008-6-16

二楼的修改是错的


[color=white]<>
2008-8-17 18:52
独孤小梦
Rank: 3Rank: 3
等级:中级会员
帖子:255
积分:2958
注册:2008-6-5

请问LS,哪里错了?我能编译出来,而且没发现哪里有问题
LS请指教!呵呵!谢谢了,我小菜不懂!

编程小菜
2008-8-18 00:52
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.064630 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved