C语言学生管理程序switch语句不执行直接退出该如何修复?
问题根因
你遇到的问题是标准输入缓冲区残留换行符导致的:
- 前面录入学生数据时使用的
scanf("%d")、scanf("%s")类操作,只会读取匹配格式的内容,用户输入完成后按下的回车键产生的\n换行符会残留在输入缓冲区中 - 后续读取选项使用的
scanf("%c", &ch),%c格式符默认不会跳过空白字符,会直接读取缓冲区中残留的\n赋值给ch变量 - 此时
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
相关产品推荐
相关产品推荐

