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

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),输出不符合预期,原代码输入处理逻辑存在缺陷。

原代码问题分析

  1. 输入缓冲区未清空:输入的整数数量超过3个时,多余数值会留在输入缓冲区中。后续验证y的while循环会直接读取这些剩余值作为y的候选值,而非等待用户输入合法的y,导致y被错误赋值,最终数组填充逻辑混乱。
  2. 合法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:53:12