C语言数组填充程序异常:多输入场景下输出不符合预期
C语言数组输入处理问题修正
问题描述
需求细节:
- 声明长度为10的整数数组,以及三个整数变量
x、y、z - 接收三个整数输入存入
x、y、z - 验证
y必须满足0 < y ≤ 10 - 将
x赋值给数组前y个元素(索引0至y-1),z赋值给剩余元素(索引y至9) - 以空格分隔输出数组
异常场景:
当输入值数量超过3个时(如输入1 -1 2 9、1 -1 -2 -3 -4 -5 2 2),输出不符合预期,原代码输入处理逻辑存在缺陷。
原代码问题分析
- 输入缓冲区未清空:输入的整数数量超过3个时,多余数值会留在输入缓冲区中。后续验证
y的while循环会直接读取这些剩余值作为y的候选值,而非等待用户输入合法的y,导致y被错误赋值,最终数组填充逻辑混乱。 - 合法
y验证逻辑未隔离多余输入:原代码的while循环会持续消耗缓冲区中的多余输入直到y合法,这违背了需求中“仅取前三个输入作为x、y、z”的逻辑。
修正后的代码
#include <stdio.h> #include <stdlib.h> int main() { int vetor[10], x, y, z; // 读取前三个输入值 scanf("%d %d %d", &x, &y, &z); // 清空输入缓冲区的多余数据,避免影响后续输入 int c; while ((c = getchar()) != '\n' && c != EOF); // 验证y的合法性,直到输入合法值 while (y <= 0 || y > 10) { printf("请输入合法的y值(0 < y ≤ 10):"); scanf("%d", &y); // 每次输入后清空缓冲区,防止非法输入残留 while ((c = getchar()) != '\n' && c != EOF); } // 填充数组 for (int i = 0; i < y; i++) { vetor[i] = x; } for (int i = y; i < 10; i++) { vetor[i] = z; } // 输出数组 for (int i = 0; i < 10; i++) { printf("%d ", vetor[i]); } printf("\n"); return 0; }
修正说明
- 清空输入缓冲区:第一次读取
x、y、z后,通过getchar()循环清空缓冲区中剩余的所有字符(直到换行或EOF),确保后续验证y时读取的是用户新输入的值,而非之前的多余输入。 - 增强合法性验证交互性:在
while循环中添加提示信息,引导用户输入合法的y值,同时每次输入后再次清空缓冲区,避免非数字字符等非法输入导致的死循环。 - 严格遵循需求逻辑:确保
x和z始终使用最初读取的前两个输入值,多余输入不会影响这两个变量的取值,仅对y进行合法性验证和重新输入处理。
内容的提问来源于stack exchange,提问作者gustavo
相关产品推荐
相关产品推荐

