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

C语言如何不硬编码实现单次单行输入多值存入自定义长度数组

实现原理

scanf的%d格式符会自动跳过所有空白字符(空格、制表符、换行符),因此不需要硬编码写全所有格式占位符,循环逐次读取单个%d即可自动匹配同一行内空格分隔的多个数值。

错误代码问题排查

你在循环内部写了5个%d但仅传入了1个存储地址,每次循环会尝试读取5个数值但仅存储第一个,剩余数值会被丢弃,同时末尾的\n会强制匹配输入中的换行符,反而会导致输入卡住。

正确实现方案

方案1:基础循环读取(兼容多场景,最常用)

这种方案不需要硬编码格式符数量,数组长度无论是宏定义还是用户动态输入都可以直接适配,不限制用户必须在同一行输入,就算用户分多行输入也能正常读取,符合绝大多数场景需求。

适配宏定义长度场景

#include <stdio.h>
#define MAX 10

int main() {
    int arr[MAX];
    int i;
    printf("请输入%d个空格分隔的数字:\n", MAX);
    for (i = 0; i < MAX; i++) {
        // 每次循环只读一个%d,自动跳过空白符,同一行输入会按顺序读取
        scanf("%d", &arr[i]);
    }
    // 输出验证
    for (i = 0; i < MAX; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

适配用户动态输入长度场景

#include <stdio.h>

int main() {
    int limit;
    printf("what is the limit? : ");
    scanf("%d", &limit);
    int arr[limit];
    int i;
    printf("请输入%d个空格分隔的数字:\n", limit);
    for (i = 0; i < limit; i++) {
        scanf("%d", &arr[i]);
    }
    // 输出验证
    for (i = 0; i < limit; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

方案2:严格限制同一行输入

如果要求用户必须把所有数值输入在同一行,禁止跨行读取,可以先读取整行内容再逐位解析:

#include <stdio.h>
#include <string.h>
#define MAX_LINE 1024 // 定义输入行的最大长度

int main() {
    int limit;
    printf("what is the limit? : ");
    scanf("%d", &limit);
    // 吃掉前面scanf留下的换行符,避免后面fgets读空行
    getchar();
    int arr[limit];
    char line[MAX_LINE];
    printf("请在同一行输入%d个空格分隔的数字:\n", limit);
    // 先读取完整一行内容
    fgets(line, sizeof(line), stdin);
    char *ptr = line;
    int offset, i = 0;
    // 循环从行字符串中读取数字,直到读够指定数量
    while (i < limit && sscanf(ptr, "%d%n", &arr[i], &offset) == 1) {
        ptr += offset;
        i++;
    }
    // 输出验证
    for (i = 0; i < limit; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Fulyze Chan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:24:04