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

如何在C语言中检测非整数输入?修复程序异常问题

问题本质

当使用scanf("%d", &val)读取输入时,若遇到非整数字符,scanf会匹配失败并返回0,同时非法字符会留在输入缓冲区中。此时val未被初始化,后续使用会触发未定义行为(比如输出随机值如-1);下一次调用scanf时,会直接读取缓冲区里的非法字符,再次匹配失败,导致跳过输入步骤。

修复方案

需要检查scanf的返回值,处理非法输入时清理缓冲区,并按要求返回错误码1。修复后的代码如下:

#include <stdio.h>
#include <ctype.h>

// 清理输入缓冲区,直到换行或EOF
void clear_input_buffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

int main(){
    int val;
    int scan_result;

    printf("Enter any number: ");
    scan_result = scanf("%d", &val);
    // 验证是否成功读取整数(%d需匹配1个输入项,成功则返回1)
    if (scan_result != 1) {
        printf("Error: Invalid input, please enter an integer.\n");
        clear_input_buffer();
        return 1;
    }
    printf("The number incremented is %d\n", val + 1);

    printf("Enter any number again: ");
    scan_result = scanf("%d", &val);
    if (scan_result != 1) {
        printf("Error: Invalid input, please enter an integer.\n");
        clear_input_buffer();
        return 1;
    }
    printf("The number decremented is: %d\n", val - 1);

    return 0;
}
核心要点
  • 检查scanf返回值:scanf的返回值代表成功匹配并赋值的输入项数量,读取整数时成功则返回1,非法输入返回0,遇到文件结束符返回EOF。
  • 清理输入缓冲区:非法输入的字符会残留在缓冲区中,必须手动清空,否则后续输入操作会直接读取这些无效字符,导致连续匹配失败。
  • 错误处理:只要任意一次输入非法,立即输出错误信息并返回错误码1,满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:31:12