为何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
相关产品推荐
相关产品推荐

