C语言错误处理:如何拦截字符输入并通过scanf识别输出错误提示
问题原因
当使用%d作为scanf_s的格式符时,如果用户输入字符,格式匹配会失败:
- 此时
scanf_s会返回0,表示没有成功匹配到整数 - 输入的字符会残留在输入缓冲区中,后续调用
scanf_s时会继续读取这个字符,反复匹配失败,最终导致程序逻辑异常 - 原代码没有对这种情况做判断,也没有清理缓冲区,就会出现输入字符后程序停止运行的问题
修复后的代码
#include <stdio.h> int main(void) { int number1 = 0; int counter; int sentinelcount = 1; int read_result; printf("请输入5个1~30之间的数值"); while (sentinelcount <= 5) { printf("\n\n输入数字:\n"); read_result = scanf_s("%d", &number1); // 匹配失败,说明输入不是整数 if (read_result != 1) { printf("请重试"); // 清空输入缓冲区的残留字符 while (getchar() != '\n' && getchar() != EOF); continue; } // 数值范围校验 if (number1 < 1 || number1 > 30) { printf("\n数值错误,请输入1~30之间的数值"); while (getchar() != '\n' && getchar() != EOF); continue; } // 输入合法,执行对应逻辑 sentinelcount++; printf("星号数量:\n"); for (counter = 1; counter <= number1; counter++) { printf("*"); } } return 0; }
核心修改说明
- 新增
scanf_s返回值判断:如果返回值不等于1,说明输入不是合法整数,直接输出重试提示 - 新增输入缓冲区清理逻辑:匹配失败或数值不合法时,清空缓冲区残留的所有字符,避免后续读取卡住
- 优化计数逻辑:只有输入完全符合要求时,才对计数变量累加,简化了原有回退计数的逻辑
内容的提问来源于stack exchange,提问作者Cik02
相关产品推荐
相关产品推荐

