You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C语言中该char类型的switch/case语句仅执行default分支?

问题原因与解决办法

核心错误点

  • char类型无法存储字符串:char a只能存储单个字符,而"Yes"、"Only Maths"这类输入是多字符组成的字符串,完全存不下。同时scanf(" %c", &a)只能读取输入的第一个字符(比如输入"Yes",a里仅存了'Y')。
  • 多字符常量写法无效:case 'Yes':是错误写法,C语言中单引号仅能包裹单个字符,多字符常量(如'Yes')属于未定义行为,编译器会将其解析为一个整数,和输入的字符完全不匹配,必然触发default分支。
  • switch不支持字符串判断:C语言的switch仅能处理整数类型(int、char、枚举等),无法直接对字符串进行分支判断。

修正后的代码

#include <stdio.h>
#include <string.h> // 引入字符串比较函数strcmp所需的头文件

int main(){
    char a[50]; // 定义足够大的字符数组存储输入的字符串

    printf("Have you passed in both maths and science?[Yes,Only Maths,Only Science,none]\n");
    // 用fgets读取包含空格的整行输入,避免scanf("%s")截断空格
    fgets(a, sizeof(a), stdin);
    
    // 去除fgets读取到的末尾换行符(如果存在)
    size_t len = strlen(a);
    if (len > 0 && a[len-1] == '\n') {
        a[len-1] = '\0';
    }

    // 用if-else配合strcmp进行字符串判断
    if (strcmp(a, "Yes") == 0) {
        printf("That's amazing!\n");
    } else if (strcmp(a, "Only Maths") == 0 || strcmp(a, "Only Science") == 0) {
        printf("That's good!\n");
    } else if (strcmp(a, "none") == 0) {
        printf("oof work harder next time!, i hope you will rock on that exam!\n");
    } else {
        printf("bozo do the typing right!\n");
    }

    return 0;
}

关键说明

  • 字符数组存储字符串:char a[50]可容纳最长49个字符的字符串(加上结束符'\0'),完全覆盖所有输入选项的长度需求。
  • fgets处理带空格的输入:scanf("%s")会在遇到空格时停止读取,无法获取"Only Maths"这类带空格的输入,fgets可以读取整行内容,包括空格。
  • strcmp比较字符串:strcmp(str1, str2)返回0表示两个字符串完全相等,这是C语言中判断字符串相等的标准方式。

内容的提问来源于stack exchange,提问作者Inferno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:06:21