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

C语言读取空格分隔的未知数量整数遇换行停止,求更简单实现方法

更简单的实现方案

你原有代码的几个明显隐患:

  • 存在空指针访问风险:for循环中先调用strtok获取下一个分割结果,未判断是否为NULL就直接传入atoi,若输入末尾带空格、或输入为空时会直接崩溃
  • 容量硬编码限制:数组、输入缓冲区都写死了大小,超出限制会发生缓冲区溢出
  • 逻辑冗余:不需要手动做字符串分割,C标准库的格式化输入函数已经可以直接处理空格分隔的数值输入

场景1:接受固定最大输入数量

如果你的业务场景里输入整数的数量不会超过100个,直接用scanf+ungetc的组合就能实现,比手动读行拆分逻辑简洁很多:

#include <stdio.h>
int main(void)
{
    int a[100];
    int cnt = 0;
    // 读满数组/读入失败/遇到换行就终止
    while (cnt < 100 && scanf("%d", &a[cnt]) == 1) {
        cnt++;
        int next_char = getchar();
        if (next_char == '\n') break;
        ungetc(next_char, stdin); // 非换行字符放回输入流供下次读取
    }
    // cnt变量就是实际读到的整数数量
    return 0;
}

场景2:支持任意数量的整数输入

如果需要适配完全未知的输入数量,只需要加动态内存扩容的逻辑即可,不需要做字符串分割处理:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int *arr = NULL;
    int cnt = 0, cap = 0, num;
    while (scanf("%d", &num) == 1) {
        // 空间不足时自动扩容
        if (cnt >= cap) {
            cap = cap == 0 ? 4 : cap * 2;
            arr = realloc(arr, cap * sizeof(int));
            if (!arr) {
                perror("内存分配失败");
                return 1;
            }
        }
        arr[cnt++] = num;
        int next_char = getchar();
        if (next_char == '\n') break;
        ungetc(next_char, stdin);
    }
    // 业务逻辑使用arr和cnt
    free(arr); // 不要忘记释放动态申请的内存
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:45:03