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

如何在C语言中接收未知大小的整数数组及后续两个整数输入

C语言实现不定长整数数组加后续两个整数的输入

问题说明

需要接收一组数量不确定的整数作为数组,之后再接收两个单独的整数,输入示例如下:

4 5 6 7 8
20
15

用户给出的代码尝试存在问题,先看原代码:

int a[1001],x,y;
int i=0;
while(scanf("%d ",&a[i])==1){
    i++
}
scanf("%d\n%d",&x,&y);

原代码的问题

  • scanf("%d ",&a[i]) 中的空格会让scanf持续读取,直到遇到非空白字符才结束循环,无法正确识别数组输入的结束
  • i++ 末尾缺少分号,属于语法错误
  • scanf("%d\n%d",&x,&y) 中的\n会让scanf忽略所有空白(包括换行),直到读取到第二个整数,不符合输入格式预期

两种可行实现方法

方法一:动态数组(无容量限制)

这种方式可根据输入数量动态调整数组大小,灵活性更高:

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

int main() {
    int *arr = NULL;
    int capacity = 0;
    int count = 0;
    int num, x, y;

    // 读取数组元素
    while (scanf("%d", &num) == 1) {
        // 内存不足时扩容,初始容量设为4,之后每次翻倍
        if (count >= capacity) {
            int new_capacity = (capacity == 0) ? 4 : capacity * 2;
            int *new_arr = realloc(arr, new_capacity * sizeof(int));
            if (new_arr == NULL) {
                perror("内存分配失败");
                free(arr);
                return 1;
            }
            arr = new_arr;
            capacity = new_capacity;
        }
        arr[count++] = num;

        // 检测输入流是否到换行(判断数组行输入结束)
        char c;
        scanf("%c", &c);
        if (c == '\n') {
            break;
        }
        ungetc(c, stdin); // 把非换行字符放回输入流
    }

    // 读取后续两个整数
    if (scanf("%d%d", &x, &y) != 2) {
        printf("读取后续整数失败\n");
        free(arr);
        return 1;
    }

    // 测试输出
    printf("数组元素:");
    for (int i = 0; i < count; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n后续两个整数:%d %d\n", x, y);

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

方法二:固定大小数组(简单有上限)

如果可以接受数组有最大容量限制,修正原代码即可:

#include <stdio.h>

int main() {
    int a[1001], x, y;
    int i = 0;

    // 读取数组元素,限制最大容量避免越界
    while (i < 1000 && scanf("%d", &a[i]) == 1) {
        char c;
        scanf("%c", &c);
        // 遇到换行说明数组行输入结束
        if (c == '\n') {
            break;
        }
        ungetc(c, stdin);
        i++;
    }

    // 读取后续两个整数,格式串不需要加换行
    scanf("%d%d", &x, &y);

    // 测试输出
    printf("数组元素:");
    for (int j = 0; j <= i; j++) {
        printf("%d ", a[j]);
    }
    printf("\n后续两个整数:%d %d\n", x, y);
    return 0;
}

注意事项

  • 使用scanf时,格式串里的空白字符会匹配输入中任意数量的空白,不要随意添加多余的空格或换行,否则会导致输入判断异常
  • 动态数组方式必须调用free释放内存,避免内存泄漏
  • 手动输入时,输入完数组行后按换行,再输入两个整数即可;文件输入时,数组为一行整数,之后两行各一个整数也能正确处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:07:46