C语言基础:Switch case处理字符输入时重复触发default问题求助
问题根因
问题完全出在scanf("%c\n", &answer);的格式字符串配置错误:
- 格式串里的
\n会让scanf主动跳过所有后续的空白字符(换行、空格、制表符都属于空白字符),只有读到下一个非空白字符才会结束本次读取操作。 - 你输入选项时是敲入字母+回车触发提交,第一次输入后,scanf会把字母读到
answer变量,但因为格式串带\n,scanf会阻塞等待你输入下一个非空白内容才返回。 - 第一次循环运行时,
answer实际读到的是上一次残留的换行符,自然命中default分支输出Try Again,第二次循环才会读到你实际输入的字母,因此出现要输入两次才匹配对应分支的异常。
修复方案
- 第一步:把scanf的格式串里的
\n删掉,改成scanf(" %c", &answer);,注意%c前面的空格是必要配置,作用是主动跳过输入缓冲区里残留的所有空白字符(包括上一次输入留下的换行符),保证每次都能读到用户输入的有效字母。 - 可选优化:如果需要兼容用户一次性输入多个字符的场景,可以在scanf读取后清空输入缓冲区,避免冗余字符连续触发default分支。
修复后完整代码示例
#include <stdio.h> #include <stdbool.h> int main() { bool switchCheck = true; char answer; printf("A. English\nB. French\nC. Spanish\nD. German\n"); do{ // %c前的空格用于跳过所有前置空白字符 scanf(" %c", &answer); switch (answer){ case 'C': printf("Very nice \n"); break; case 'B': case 'A': case 'D': printf("Sorry! Incorrect. Code Ends\n"); switchCheck = false; break; default: printf("Try Again\n"); } }while(switchCheck == true); return 0; }
内容的提问来源于stack exchange,提问作者Jacob G
相关产品推荐
相关产品推荐

