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

C语言逗号分隔字符串转数组时字符类型处理异常问题求助

问题根因
  • 变量类型定义错误:你需要存储多个字符串(即多个char*指针),因此s1应该定义为char**类型而非char*,ListChar函数的第二个参数list也应该是char**类型,否则list[n] = strdup(t)会把64位/32位指针地址截断为单个char值,自然出现乱码。
  • 此前整数转换逻辑正常,是因为你当时list对应的是int*类型,赋值list[n] = atoi(t)是直接把整数值存入对应int空间,类型匹配;但字符串需要存储char*指针,原char* list的类型完全不匹配,才会出现乱码。
  • 野指针访问:void* value没有分配内存就直接执行memcpy,属于未定义行为,会触发崩溃或乱码。
  • 内存分配逻辑错误:原calloc分配的是no * 81字节的字符空间,而非存储no个字符串指针的空间,完全不符合存储需求。
  • 内存泄漏隐患:原代码中strdup申请的内存没有对应释放逻辑,会造成内存泄漏。
修正方案

调整ListChar函数定义

// 第二个参数改为char**类型,对应存储字符串指针的数组
int ListChar(char *buf, char** list, int maxloop, char* delim)
{
    int n = 0;
    char *s,*t;
    s = strdup(buf);
    t = strtok(s, delim);
    while (t && (n < maxloop))
    {
        if (list != NULL) {
            // 先释放原有预分配的内存,避免泄漏
            if (list[n] != NULL) free(list[n]);
            list[n] = strdup(t);
        }
        n++;
        t = strtok(NULL, delim);
    }
    free(s);
    return n;
}

修正主函数逻辑

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// mchar定义为81个A
#define mchar "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

int main()
{
    char **s1;
    int k, no = 5;
    char* variable = "R1,R2,R3,R4,R5";
    // 给value分配对应大小的指针数组空间
    char** value = calloc(no, sizeof(char*));

    // 分配no个char*指针的空间
    s1 = calloc(no, sizeof(char*));
    // 预分配每个元素的初始值
    for (k = 0; k < no; k++) s1[k] = strdup(mchar);
    // 传入s1本身(char**类型)
    ListChar(variable, s1, no, ",");
    // 拷贝指针数组内容到value
    memcpy(value, s1, no * sizeof(char*));
    // 只释放s1的指针数组空间,不要释放s1[k],因为已经被value引用
    free(s1);

    int i;
    for (i = 0; i < no; i++) {
        printf("%s ", value[i]);
        // 用完释放strdup申请的内存
        free(value[i]);
    }
    // 释放value本身的空间
    free(value);
    printf("\n");
    return 0;
}
运行验证

修正后代码可正常输出分隔后的字符串:
R1 R2 R3 R4 R5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:15:07