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

如何用C语言实现字符串分割并返回字符串数组?

实现C语言版的字符串分割功能(类似C#的string.Split)

你需要实现的是将空格分隔的输入字符串分割为字符串数组,类似C#的string.Split功能。先梳理你代码里的核心问题,再给出修正后的实现:

原代码的关键问题

  • 函数返回值错误:C语言不支持直接返回二维数组,应该把输出数组作为参数传入函数,同时返回分割得到的元素数量。
  • 不安全的输入函数:gets函数已被C标准废弃,存在缓冲区溢出风险,必须替换为fgets,同时要处理fgets读取到的换行符。
  • 数组操作误区:C语言没有类似C#的.length属性获取数组长度,需要手动记录分割出的元素个数;另外strtok返回的是原字符串内部的指针(原字符串会被strtok修改,插入\0截断),不能直接赋值给数组元素,必须用strcpy把字符串内容复制到输出数组的对应位置。
  • 变量未定义与循环逻辑错误:函数内的outArray未声明,且原循环会导致最后一个元素被赋值为NULL,计数逻辑需要调整。

修正后的完整代码

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

// 分割字符串:将str按空格分割,结果存入out数组,返回分割得到的元素个数
int splitString(char str[], char out[50][50])
{
    int count = 0;
    // 第一次调用strtok,传入原字符串和分隔符
    char* token = strtok(str, " ");
    
    while (token != NULL)
    {
        // 将token指向的字符串复制到out数组的对应位置
        strcpy(out[count], token);
        count++;
        // 后续调用strtok,第一个参数传NULL,继续分割原字符串
        token = strtok(NULL, " ");
    }
    
    return count;
}

int main()
{
    char str[200];
    char outArr[50][50];
    int elementCount;

    puts("Enter text:");
    // 用fgets读取输入,避免缓冲区溢出
    fgets(str, sizeof(str), stdin);
    
    // 去掉fgets读取到的换行符(如果存在)
    str[strcspn(str, "\n")] = '\0';
    
    // 调用分割函数,获取元素个数
    elementCount = splitString(str, outArr);
    
    // 遍历输出结果
    for (int i = 0; i < elementCount; i++)
    {
        printf("out[%d] = %s\n", i, outArr[i]);
    }

    return 0;
}

代码说明

  1. splitString函数:接受输入字符串和输出数组,返回分割后的元素数量。使用strtok分割字符串,每次获取到token后用strcpy复制到输出数组中,避免依赖原字符串的内存。
  2. 输入处理:用fgets读取输入,通过strcspn去掉末尾的换行符,避免分割结果包含多余的换行。
  3. 结果输出:根据返回的元素个数遍历输出数组,实现你需要的格式。

测试输入draw 1 2 3,输出如下:

out[0] = draw
out[1] = 1
out[2] = 2
out[3] = 3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:41:41