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

C语言中使用scanf结合EOF验证数组输入是否为整数

解决scanf读取整数时区分输入错误与EOF的问题

核心思路是先保存scanf的返回值,再根据返回值分支处理,别重复调用scanf导致输入被多读一次。scanf的返回值规则很明确:

  • 成功读取1个整数时,返回1
  • 遇到文件末尾(EOF)时,返回EOF(值为-1)
  • 读取失败(比如输入非数字字符)时,返回0

下面是符合你需求的完整代码示例(以静态二维数组为例,记得根据你的数组大小调整索引逻辑):

#include <stdio.h>

int main() {
    // 静态分配的二维数组,根据你的需求调整大小
    int number[10][10];
    int i = 0, j = 0;
    int ret; // 保存scanf的返回值

    while (1) {
        ret = scanf("%d", &number[i][j]);
        
        if (ret == 1) {
            // 成功读取整数,处理数组索引
            j++;
            if (j >= 10) { // 假设每行最多10个元素
                j = 0;
                i++;
                if (i >= 10) { // 数组已满,退出循环
                    break;
                }
            }
        } else if (ret == EOF) {
            // 遇到文件末尾,正常退出
            break;
        } else {
            // 输入不是整数,提示错误并清理输入缓冲区
            printf("Incorrect input.\n");
            // 把输入流里的无效字符读掉,直到换行或EOF
            int c;
            while ((c = getchar()) != '\n' && c != EOF);
        }
    }

    // 这里可以添加处理读取完成后的逻辑
    return 0;
}

关键细节说明

  1. 保存返回值:用ret变量存scanf的结果,避免重复调用scanf,否则会跳过输入流里的字符,导致逻辑混乱。
  2. 清理缓冲区:当输入错误时,必须把留在输入流里的非数字字符全部读走,不然下一次scanf会继续读取这些无效字符,陷入死循环。
  3. 数组越界检查:静态数组有固定大小,记得在索引增长时判断是否超出容量,避免数组越界错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:50:55