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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:57:03