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; }
关键细节说明
- 保存返回值:用
ret变量存scanf的结果,避免重复调用scanf,否则会跳过输入流里的字符,导致逻辑混乱。 - 清理缓冲区:当输入错误时,必须把留在输入流里的非数字字符全部读走,不然下一次scanf会继续读取这些无效字符,陷入死循环。
- 数组越界检查:静态数组有固定大小,记得在索引增长时判断是否超出容量,避免数组越界错误。
内容的提问来源于stack exchange,提问作者Grolldash
相关产品推荐
相关产品推荐

