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

C语言学生管理程序switch语句不执行直接退出该如何修复?

问题根因

你遇到的问题是标准输入缓冲区残留换行符导致的:

  1. 前面录入学生数据时使用的scanf("%d")、scanf("%s")类操作,只会读取匹配格式的内容,用户输入完成后按下的回车键产生的\n换行符会残留在输入缓冲区中
  2. 后续读取选项使用的scanf("%c", &ch),%c格式符默认不会跳过空白字符,会直接读取缓冲区中残留的\n赋值给ch变量
  3. 此时ch的值不是预期的'1'或'2',会直接进入default分支打印错误提示后执行完剩余代码退出,看起来就像switch语句没有执行
修复方案

1. 直接修复选项读取逻辑

在读取选项的scanf的格式符%c前添加一个空格,空格会指示scanf自动跳过所有前置空白字符,正确读取用户输入的选项:

// 修改前:
// scanf("%c",&ch);
// 修改后:
scanf(" %c",&ch);

如果缓冲区残留多个空白字符,也可以在读取选项前先清空输入缓冲区:

// 清空输入缓冲区残留内容
while(getchar() != '\n');
scanf("%c",&ch);

2. 额外逻辑问题修复

你的代码还存在数组越界、学号查询逻辑错误的问题,建议一并修复:

  • 动态申请的st数组下标范围是0 ~ n-1,当前循环for(i=1;i <= n;i++)会访问到st[n]越界地址,建议将循环改为for(i=0;i < n;i++)
  • 当前查询逻辑直接将输入的学号作为数组下标取值,只有当学号严格从1连续排列时才有效,建议改为遍历所有学生匹配rollno字段再输出信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:30:04