当执行完第一个scanf语句后,第二个scanf语句像失效一样,直接跳到了第三个scanf语句,导致x2无法完成初始化,哪里错了呀

问题遇到的现象和发生背景

当执行完第一个scanf语句后,第二个scanf语句像失效一样,直接跳到了第三个scanf语句,导致x2无法完成初始化,哪里错了呀

#include<stdio.h>

#include<math.h>
#define e 2.718
int main() {
int x1,;
int x2;
int x3;
char k1;
char k2;
char k3;
char k4;
double w1 = 0.3;
double w2 = 0.4;
double w3 = 0.3;
double y;
double z;
double v = 0.5;
printf("今天的天气如何?\n");
printf("A.晴天 B.阴天 C.雨天\n");
scanf("%c", &k1);
switch (k1) {
case 'A':x1 = 9;
break;
case 'B':x1 = 6;
break;
case 'C':x1 = 0;
break;
default: printf("选择有误,请重新选择\n");
}
printf("\n有没有人陪你去看电影?\n");
printf("A.有,男/女朋友 B.有,好朋友 C.有,家人 D.没有\n");
scanf("%c", &k4);
switch (k4) {
case 'A':x2 = 8;
break;
case 'B':x2 = 6;
break;
case 'C':x2 = 5;
break;
case 'D':x2 = 2;
break;
default:printf("选择有误,请重新选择\n");
}
printf("\n票价如何?\n");
printf("A.0-30 B.30-60 C.60-90 D.90以上\n");
scanf("%c", &k3);
switch (k3) {
case 'A':x3 = 10;
break;
case 'B':x3 = 8;
break;
case 'C':x3 = 2;
break;
case 'D':x3 = 0;
break;
default:printf("选择有误,请重新选择\n");
}
z = (x1w1 + x2w2 + x3*w3) / 10;
y = 1 / (1 + pow(e, -z));
printf("你去看电影的可能性为:%d\n", z);
if (z >= v)
printf("去看电影");
else
printf("不去看电影");
return 0;
}

运行结果及报错内容

img

img

(1)在scanf读取字符后,需要加getchar()来吸收回车符,否则影响下一次输入;
(2)因为有输入错误的设置,所以每次输入,都需要放在while循环中,否则当输入错误时,不能重新输入。
代码修改如下:

#include<stdio.h>
#include<math.h>
#define e 2.718
int main() {
    int x1;
    int x2;
    int x3;
    char k1;
    char k2;
    char k3;
    char k4;
    double w1 = 0.3;
    double w2 = 0.4;
    double w3 = 0.3;
    double y;
    double z;
    double v = 0.5;

    int flag = 1; //修改  添加一个变量,用于控制while
    printf("今天的天气如何?\n");
    printf("A.晴天 B.阴天 C.雨天\n");
    while (flag) //修改,用while语句,否则当输入错误时,不能重新输入
    {
        scanf("%c", &k1);
        getchar(); //修改1,这里增加这一句
        switch (k1) {
        case 'A':x1 = 9; flag = 0;//时while结束
            break;
        case 'B':x1 = 6; flag = 0;
            break;
        case 'C':x1 = 0; flag = 0;
            break;
        default: printf("选择有误,请重新选择\n");
        }
    }
    flag = 1; //重置flag
    printf("\n有没有人陪你去看电影?\n");
    printf("A.有,男/女朋友 B.有,好朋友 C.有,家人 D.没有\n");
    while (flag)
    {
        scanf("%c", &k4);
        getchar(); //修改2
        switch (k4) {
        case 'A':x2 = 8; flag = 0;
            break;
        case 'B':x2 = 6; flag = 0;
            break;
        case 'C':x2 = 5; flag = 0;
            break;
        case 'D':x2 = 2; flag = 0;
            break;
        default:printf("选择有误,请重新选择\n");
        }
    }
    printf("\n票价如何?\n");
    printf("A.0-30 B.30-60 C.60-90 D.90以上\n");
    flag = 1;
    while (flag)
    {
        scanf("%c", &k3);
        getchar();
        switch (k3) {
        case 'A':x3 = 10; flag = 0;
            break;
        case 'B':x3 = 8; flag = 0;
            break;
        case 'C':x3 = 2; flag = 0;
            break;
        case 'D':x3 = 0; flag = 0;
            break;
        default:printf("选择有误,请重新选择\n");
        }
    }
    z = (x1*w1 + x2*w2 + x3 * w3) / 10;
    y = 1 / (1 + pow(e, -z));
    printf("你去看电影的可能性为:%d\n", z);
    if (z >= v)
        printf("去看电影");
    else
        printf("不去看电影");
    return 0;
}

读取字符之前前面要加个getchar()读入回车符

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632