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

scanf循环向数组赋值时首输入被忽略,输出异常求助

问题分析与修复:C语言数组输入输出异常

核心问题

你这段代码的根本错误是变量Q在声明变长数组A、B时未初始化,直接触发了未定义行为:

  • 当执行int Q, A[Q], B[Q];时,Q是未初始化的自动局部变量,值为栈内存中的随机垃圾值。此时创建的A和B是变长数组(VLA),大小由该随机值决定,这本身就违反了C语言的规范。
  • 后续通过scanf给Q赋值为3,但数组A、B的大小不会随Q的更新而改变,依然保持之前的随机垃圾值。
  • 栈内存通常是连续布局的,Q的内存位置很可能与数组A、B的存储区域重叠。当你向数组元素写入数据时,会意外覆盖其他内存区域的内容——比如你的案例中,A[i]和B[i]的内存地址重合,导致第二个输入值覆盖了第一个,最终输出重复的第二个数。

修复方案

方案1:调整声明顺序(优先使用)

先读取Q的有效值,再基于确定的Q声明数组:

#include <stdio.h>

int main() {
    int Q;
    // 先获取Q的有效值
    scanf("%d", &Q);
    // 再用Q声明数组
    int A[Q], B[Q];

    for(int i=0; i<Q; i++){
        scanf("%d %d", &A[i], &B[i]);
    }

    for(int i=0; i<Q; i++){
        printf("%d %d\n", A[i], B[i]);
    }
    return 0;
}

方案2:动态内存分配(适合大数组场景)

如果Q的值可能很大,栈上的变长数组容易引发栈溢出,推荐使用malloc动态分配内存:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int Q;
    scanf("%d", &Q);
    // 动态分配内存
    int *A = malloc(Q * sizeof(int));
    int *B = malloc(Q * sizeof(int));

    // 检查内存分配是否成功
    if(A == NULL || B == NULL){
        printf("内存分配失败\n");
        return 1;
    }

    for(int i=0; i<Q; i++){
        scanf("%d %d", &A[i], &B[i]);
    }

    for(int i=0; i<Q; i++){
        printf("%d %d\n", A[i], B[i]);
    }

    // 释放动态分配的内存
    free(A);
    free(B);
    return 0;
}

内容的提问来源于stack exchange,提问作者kaynan.ghael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:30:54