| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2336 人关注过本帖
标题:学习C语言时遇到问题,求大神解答QwQ
只看楼主 加入收藏
RiceD
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-7-12
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
学习C语言时遇到问题,求大神解答QwQ
本人在做某本C语言教材上的习题时遇到了问题:
问题状况:在输入错误字符时会输出2句及以上的“输入错误,请重新输入!”,输入1个错误字符会出现两句,2个会出现三句,以此类推
问题代码:
程序代码:
#include <stdio.h>
#include <ctype.h>
int main()
{
    int n=0;
    double C=0,F=0;
    printf("选择转换模式\n1.摄氏度转华氏度        输入A\n2.华氏度转摄氏度        输入B\n");
    for (char choice=0;choice!='A'&&choice!='B'&&choice!='a'&&choice!='b';n++)    //是不是这个for语句出现了问题?
    {
        if(n!=0) printf("输入错误,请重新输入!\n");    //该语句会输出两次
        scanf("%c",&choice);
    }
    if(toupper(choice)=='A')
    {
        printf("输入摄氏温度\n");
        scanf("%lf",&C);
        F=C*1.8+32;
        printf("%.2lf摄氏度等于%.2lf华氏度\n",C,F);
    }    
    else if (toupper(choice)=='B')
    {
        printf("输入华氏温度\n");
        scanf("%lf",&F);
        C=(F-32)*5/9;
        printf("%.2lf华氏度等于%.2lf摄氏度\n",F,C);
    }
    return 0;
}

希望大神们能解决这个问题。
谢谢!
搜索更多相关主题的帖子: C语言 
2016-07-12 18:00
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:2 
scanf("%c", &choice);在第二次循环时接收了输入错误字母时的回车,所以会再次循环。
可以这样写来避免接收回车键
scanf(" %c", &choice);
2016-07-12 18:17
平常心q
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:120
专家分:550
注 册:2016-3-31
收藏
得分:2 
for (char choice=0;choice!='A'&&choice!='B'&&choice!='a'&&choice!='b';)    //for语句去掉n++, 没有意义!
    {
        scanf("%s",&choice);
        
        if (choice!='A'&&choice!='B'&&choice!='a'&&choice!='b')printf("输入错误,请重新输入!\n");
    }

这样就可以达到你的要求!
2016-07-12 19:41
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:2 
回复 3楼 平常心q
楼主的n++是有用的,因为choice的初值是0,所以for循环开始运行,此时的n=0,因此if不会执行。
提醒一下,你scanf里的s是不对的,因为定义的是单个字符。
2016-07-12 21:35
平常心q
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:120
专家分:550
注 册:2016-3-31
收藏
得分:0 
回复 4楼 linlulu001
可是我运行的测试的时候,可以达到楼主的要求

下面没有用到n,所以没有必要定义n

%c格式对应的是单个字符。所以在输入多个字符的时候,它只会读取第一个字符,之后的字符是无法读入完成任务的
%S格式对应的是字符串。

在此处若用%c是无法达到用户要求的!

以程序运行测试为例
2016-07-12 23:08
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
回复 5楼 平常心q
用%s是将输入回车键转化成‘\0’,表面上看达到了目的。但是数据溢出。只是没有输出,你看不到而已。
2016-07-12 23:18
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:8 
接受了上次输入的回车问题;三种方法:1、最简单,在scanf里面的%c前面加个空格2、在scanf后面加一句getchar();3:写一个清空缓存的函数
2016-07-13 08:28
U201010009
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:73
专家分:178
注 册:2013-2-25
收藏
得分:6 
楼上说得对,还是建议使用楼上说的第三种方法,在调用scanf之前清空缓存,比如用这句 fflush(stdin);
2016-07-13 11:15
RiceD
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-7-12
收藏
得分:0 
回复 7楼 wanglianyi1
首先感谢您和其他网友的回答!
实际上我先借鉴2l的回帖尝试了第一种办法,但是结果不是很尽如人意...但还是感谢2l细致的回答!;
第二种办法,由于初学,没有掌握,不太会用,只得放弃;
最终采用第三种办法,把8l的代码贴进了程序,效果非常理想!然而对于这个清空缓存的函数,了解的极为浅显,还需继续学习!;
另外还要感谢3l和4l的帮助!
再次感谢!
2016-07-13 18:34
为瞬间停留
Rank: 1
等 级:新手上路
威 望:1
帖 子:14
专家分:4
注 册:2016-6-13
收藏
得分:0 
1.我把你的复制一下,首先这行  for (char choice=0;choice!='A'&&choice!='B'&&choice!='a'&&choice!='b';n++)  有个错误  error: 'for' loop initial declarations are only allowed in C99 or C11 mode  把char choice=0放到前面就行了。
        char choice=0;
        for (;choice!='A'&&choice!='B'&&choice!='a'&&choice!='b';n++)  
2.把scanf("%c",&choice);  换成        choice = getchar();getchar(); 这时候如果你只打一个字母然后回车没问题。但是如果你一连串输入好多, 它是两个一对,然后判断第一个是否为AaBb,所以最可靠你可以把choice搞成字符数组,然后可以判断不让它输入好多字符,取这个数组第一个字符进行判断是否为AaBb,是个建议,可能可以,不过这他妈好像偏离你的主题,还是要解决主要矛盾。
2016-07-13 19:49
快速回复:学习C语言时遇到问题,求大神解答QwQ
数据加载中...
 
   



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

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