如何用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; }
代码说明
- splitString函数:接受输入字符串和输出数组,返回分割后的元素数量。使用
strtok分割字符串,每次获取到token后用strcpy复制到输出数组中,避免依赖原字符串的内存。 - 输入处理:用
fgets读取输入,通过strcspn去掉末尾的换行符,避免分割结果包含多余的换行。 - 结果输出:根据返回的元素个数遍历输出数组,实现你需要的格式。
测试输入draw 1 2 3,输出如下:
out[0] = draw out[1] = 1 out[2] = 2 out[3] = 3
内容的提问来源于stack exchange,提问作者user3120454
相关产品推荐
相关产品推荐

