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

为何switch分支中读取name的scanf语句被跳过?移除switch后程序运行正常

问题分析:输入被scanf跳过,真的是Switch语句的锅吗?

嘿,这个问题其实不是switch语句本身导致的,罪魁祸首是输入缓冲区里残留的换行符!咱们来一步步拆解原因:

问题根源:输入缓冲区的残留字符

当你输入A然后按下回车时,输入缓冲区里实际存储的是'A' + '\n'(回车对应的ASCII字符是换行符\n):

  • 你的第一个scanf(" %c", &opt)里的前置空格会自动跳过空白字符(如果有的话),成功读取到'A',但此时缓冲区里还剩下那个'\n'。
  • 进入case 'A'后,执行到scanf("%[^\n]s", name)——这个格式串的作用是读取所有不是换行符的字符,直到遇到换行符为止。但此时缓冲区里第一个字符就是'\n',所以这个scanf直接匹配结束,没有读取到任何有效内容,程序就直接跳到下一个输入步骤,看起来像是跳过了姓名输入。

为什么移除Switch后看似正常?

这只是巧合或者测试场景的差异而已——本质上这个bug和switch没有任何关系。哪怕不用switch,只要输入缓冲区里留着换行符,使用%[^\n]格式的scanf都会出现同样的跳过问题。

修复方案

1. 清空输入缓冲区残留的换行符

在读取opt之后,用getchar()吃掉残留的换行:

#include <stdio.h>
int main() {
    char opt;
    scanf(" %c", &opt);
    getchar(); // 吃掉输入'A'后留下的换行符
    switch (opt) {
        case 'A':
            printf("Please Enter a New Name:");
            char name[200];
            scanf("%[^\n]", name); // 这里不需要加s,%[^\n]是完整格式符
            printf("Please Enter a New Code:");
            char code[200];
            scanf("%s", code);
            printf("Please Enter the Number:");
            int number;
            scanf("%d", &number); // 修正:需要取变量地址
            printf("%s\n%s\n%d", name, code, number);
            printf("\nPlease press Enter to confirm Creation");
            break; // 记得加break,避免后续case(如果有的话)被执行
    }
}

2. 让scanf自动跳过空白字符

在读取姓名的scanf格式串前加一个空格,scanf会自动跳过所有空白字符(包括换行、空格、制表符等):

scanf(" %[^\n]", name);

额外修正:scanf的地址错误

你的代码里scanf("%d", number)是错误的,scanf需要传入变量的地址才能写入值,应该改成scanf("%d", &number),否则会导致未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:52:32