2 perfectwangandy PerfectWangAndy 于 2017.01.09 23:13 提问

这个C语言逻辑错误怎么改?

//输入星期几的第一个字母来判断是星期几
//若有相同的,则继续输入第二个字母,继续判断
//环境是mac OS下的Xcode
//这个环境没有conio.h头文件,所以不能用getch和getche,所以只能用getchar

/*
Sunday 星期日
Monday 星期一
Tuesday 星期二
Wednesday 星期三
Thursday 星期四
Friday 星期五
Saturday 星期六
*/

#include
int main(){
printf("请输入:");//输入之后按回车
char one;
scanf("%c", &one);
switch(one){
case 's':
printf("请输入第二个字母\n");//输入之后按回车
if(getchar() == 'a'){
printf("星期六\n");
}
else if (getchar() == 'u'){
printf("星期日\n");
}
else{
printf("非法输入!\n");
}
break;
case 'm':printf("星期一\n");break;
case 't':printf("请输入第二个字母\n");//输入之后按回车
if(getchar() == 'u'){
printf("星期二\n");
}
else if (getchar() == 'h'){
printf("星期四\n");
}
else{
printf("非法输入!\n");
}
break;
case 'w':printf("星期三\n");break;
case 'f':printf("星期五\n");break;
default:printf("非法输入!");
}
return 0;
}
/*
这是结果。很明显不应该显示非法输入啊,应该是星期六才对啊。
请输入:s
请输入第二个字母
a
非法输入!
Program ended with exit code: 0


我又试了一下,这样是对的,为什么啊?
请输入:s
请输入第二个字母
u
星期日
Program ended with exit code: 0
*/
后来我
把第24行的 ‘a’ 改为 'u'
把第25行的 星期六 改为 星期日
把第27行的 ‘u’ 改为 'a'
把第28行的 星期日 改为 星期六
这么修改之后,输入s然后输入a,结果是对的!
但是输入s然后输入u结果就不对了,显示非法输入!
*/
//求大神救救我吧~
图片说明

4个回答

zjn640322
zjn640322   2017.01.10 10:15

小哥,你这第一个输入s后,按回车键结束输入的,在getchar()时它先接收的是你上次结束时的\n字符,故在正式接收字符之前需要先处理你上次结束时的\n字符,下面给你代码
#include

int main()
{
printf("请输入:\n");
char one;
scanf("%c",&one);

switch (one) {
    case 's':
        printf("请输入第二个字母\n");
        getchar();                  // 处理你上次结束标记的\n字符
        if (getchar() == 'a') {
            printf("星期六");
        }else if(getchar() == 'u'){
            printf("星期日\n");
        }else{
            printf("非法输入\n");
        }
        break;

    case 'm':
        printf("星期一\n");
        break;

    case 't':
        getchar();// 处理你上次结束标记的\n字符
        printf("请输入第二个字母\n");
        if (getchar() == 'u') {
            printf("星期二\n");
        }else if(getchar() == 'h'){
            printf("星期四\n");
        }{
            printf("非法输入\n");
        }

        break;
    case 'w':

        printf("星期三\n");
        break;

    case 'f':
        printf("星期五\n");
        break;

    default:
        printf("非法输入\n");
        break;
}

}

ai977313677
ai977313677   2017.01.09 23:33

在进入case之后,printf之前加一个char变量,然后用getchar将字符读给这个新的char变量,但不要对这个变量做其他操作。

ai977313677
ai977313677 你是用的新添加的变量在printf之前getchar吗?
11 个月之前 回复
PerfectWangAndy
PerfectWangAndy 还是不行啊,我这样试过,这样改的话会出现新的问题:输入s然后按下回车之后,显示“请输入第二个字母”然后紧接着显示“非法输入!”,然后程序直接结束。为什么不在getchar的地方停一下等待输入呢?
11 个月之前 回复
honest1120110
honest1120110   2017.01.10 00:02

应该是getcar()读取的问题,24行设个断点看看读到了什么东西就知道怎么改了

PerfectWangAndy
PerfectWangAndy   2017.01.10 09:49

图片说明

PerfectWangAndy
PerfectWangAndy 我调试过,在跑到28行的时候two的值是'\0'
11 个月之前 回复
PerfectWangAndy
PerfectWangAndy 非法输入后面的s是我为了区分36行的“非法输入!”和default语句中的“非法输入!”而故意加的。
11 个月之前 回复
PerfectWangAndy
PerfectWangAndy 这是我后来改的,但是这样还是不行,新的问题又来了,程序运行到28行的时候不会停下来等待输入,而是继续运行,显示“非法输入”。为什么啊。
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!