C语言中switch-case语句处理字符类型时无法正常生效的问题
问题根因
- 格式符误用:
%s是字符串读取格式符,哪怕输入单个字符,也会额外写入1字节的字符串结束符\0,如果c是单字节char类型,会直接发生内存越界,破坏c存储的实际值,导致switch匹配失败。 - 输入类型和预期不匹配:需求是读取单个字符,应该使用单字符对应的格式符,而非字符串格式符。
把代码改成int类型输入时能正常运行,本质是%d读取整数时写入的字节长度和int类型占用空间匹配,没有越界问题,所以分支匹配正常。
修正代码
先把变量c定义为char类型,调整scanf_s的读取逻辑:注意scanf_s是安全版本函数,读取%c单字符时需要额外传入缓冲区长度参数,格式符前加空格可以自动跳过输入缓冲区残留的换行、空格等空白字符,避免读取到无效值。
#include <stdio.h> int main() { char c; printf("choose: \n[w=woman] [m=man] "); // 格式符前的空格用于跳过前置空白字符,最后一个参数1表示读取缓冲区的长度为1字节 scanf_s(" %c", &c, 1); switch (c) { case 'w': printf("45,5"); break; case 'm': printf("50"); break; default: printf("input invalid"); break; } return 0; }
补充说明
如果你一定要用%s格式读取,需要把c定义为长度至少为2的字符数组(存有效字符+结束符),switch判断时取数组首元素即可,但这种方式对多字符输入的兼容性更差,优先用单字符读取方案。
// 不推荐的%s实现方式参考 char c[2]; printf("choose: \n[w=woman] [m=man] "); scanf_s("%s", c, 2); switch (c[0]) { case 'w': printf("45,5"); break; case 'm': printf("50"); break; default: printf("input invalid"); break; }
内容的提问来源于stack exchange,提问作者user17505134
相关产品推荐
相关产品推荐

