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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:24:03