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

C语言按分隔符拆分字符串并存储为int数组的赋值问题求助

问题分析与解决

核心错误点

  • 未初始化的输入指针
    char *input; 仅声明了指针但未分配内存空间,直接执行 scanf("%s", &input); 会写入非法内存,触发未定义行为。

  • 动态数组分配逻辑错误
    每次循环都通过 calloc 重新分配数组:

tab = (int*)calloc((tabSize + 1), sizeof(int));

calloc 会创建一块全新的、初始化为0的内存区域,之前分配的数组会被丢弃(造成内存泄漏),新数组中只有当前赋值的 tab[tabSize] 有有效数据,其余元素均为默认的0,这就是前三个元素为0、仅最后一个元素正常的原因。

  • strtok参数类型不匹配
    strtok(&input, ",") 中,strtok 要求第一个参数为 char* 类型,但此处传入的是 char**(&input),属于类型错误,可能导致意外行为。

修正后的代码

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

int main()
{
    // 用固定大小数组存储输入,避免未初始化指针问题,也可根据需求改用动态分配
    char input[1024];
    int *tab = NULL;
    int tabSize = 0;

    // 读取用户输入的字符串
    scanf("%s", input);

    // 首次分割字符串
    char *token = strtok(input, ",");

    while(token != NULL)
    {
        // 用realloc扩展数组,保留原有数据
        int *temp = realloc(tab, (tabSize + 1) * sizeof(int));
        if (temp == NULL) {
            // 内存分配失败时的错误处理
            fprintf(stderr, "内存分配失败\n");
            free(tab);
            return 1;
        }
        tab = temp;

        // 将转换后的整数存入数组对应位置
        tab[tabSize] = atoi(token);

        token = strtok(NULL, ",");
        tabSize++;
    }

    // 遍历打印数组元素
    for (int i = 0; i < tabSize; i++)
    {
        printf("%d\n", tab[i]);
    }

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

关键修正说明

  • 输入处理优化:改用固定大小的char input[1024]存储输入,简单直接,适合新手快速上手;若需处理超长输入,可替换为malloc动态分配内存。
  • 数组扩展逻辑修正:用realloc替代calloc,realloc会保留原有数组的所有数据并扩展内存空间,彻底解决数据丢失和内存泄漏问题。
  • 内存安全保障:增加realloc失败的判断逻辑,避免空指针操作导致程序崩溃。
  • 参数类型修正:直接传入input(char*类型)给strtok,符合函数参数要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:55:17