C语言中如何让switch的default分支在输入非法值时触发?
解决C语言最大值程序非法输入判断问题
原程序试图通过switch分支处理非法输入,但实际输入浮点数、字符等非整数值时,程序会输出随机的“最大值”,无法触发default分支。这是因为scanf("%d%d")在遇到非整数输入时,会停止匹配,未成功赋值的变量a或b会保留随机垃圾值,导致c = a > b的结果只能是0或1,永远走不到default分支。
修改方案
要实现非法输入时输出指定错误信息,需要从输入有效性检查和缓冲区清理两方面调整代码:
- 检查
scanf的返回值:scanf的返回值代表成功读取的变量个数,我们需要读取2个整数,只有返回值为2时,才说明输入是有效的两个整数。 - 清空输入缓冲区:如果输入无效,残留的非法字符会留在缓冲区中,需要彻底清空,避免影响后续操作。
- 调整逻辑分支:仅当输入有效时,才执行最大值判断;输入无效时直接输出错误信息。
修改后的完整代码
#include <stdio.h> int main() { int a, b, c; // 获取scanf的返回值,判断是否成功读取2个整数 int input_result = scanf("%d%d", &a, &b); if (input_result == 2) { c = a > b; switch (c) { case 0: printf("%d is maximum\n", b); break; case 1: printf("%d is maximum\n", a); break; } } else { // 清空输入缓冲区的残留字符 while(getchar() != '\n'); printf("Invalid Input\n"); } return 0; }
代码说明
- 输入有效性判断:通过
input_result == 2确认用户输入了两个合法整数,只有此时才执行最大值判断逻辑。 - 缓冲区清理:
while(getchar() != '\n')会逐个读取缓冲区中的字符,直到遇到换行符,确保后续输入不受残留字符干扰。 - 错误处理:输入无效时直接输出"Invalid Input",无需进入
switch分支。
内容的提问来源于stack exchange,提问作者Mazin
相关产品推荐
相关产品推荐

