C语言中不使用strtok函数实现字符串按指定字符分割的方案
C语言实现按指定分隔符分割字符串为二维数组
你好呀!我看了你想要实现的字符串分割功能,还有你写的代码片段,这里帮你梳理问题并给出完整的可运行解决方案~
首先先说说你现有代码里的几个小问题:
void main语法错误,正确写法是void main()或者更规范的int main()- 没有声明存储原字符串的变量
longstring,得先定义一个足够大的字符数组 gets函数已经被C标准废弃了,它存在缓冲区溢出的安全隐患,建议用更安全的fgets替代- 缺少分隔符的输入逻辑,以及核心的字符串分割、二维数组存储的实现
下面是完整的可运行代码,我加了详细注释方便你理解:
#include <stdio.h> #include <string.h> int main() { // 定义存储原字符串的数组,长度可根据实际需求调整 char longstring[100]; // 存储用户输入的分隔符 char sep; // 二维数组存储分割后的子串:最多支持20个子串,每个子串最多50个字符 char result[20][50]; int i = 0, j = 0, sub_str_count = 0; // 读取原字符串 printf("请输入一个以指定分隔符分隔的字符串(例如 jasf@fjaf@afsj):\n"); // 用fgets替代gets,避免缓冲区溢出,同时去除fgets读取到的换行符 fgets(longstring, sizeof(longstring), stdin); longstring[strcspn(longstring, "\n")] = '\0'; // 读取分隔符 printf("请输入分隔字符(例如 @):\n"); // 前面的空格用于跳过输入原字符串后残留的换行符,避免误读换行符为分隔符 scanf(" %c", &sep); // 核心分割逻辑 while (longstring[i] != '\0') { if (longstring[i] != sep) { // 当前字符不是分隔符,存入二维数组的当前行 result[sub_str_count][j++] = longstring[i]; } else { // 遇到分隔符,给当前子串添加字符串结束符,切换到下一行 result[sub_str_count][j] = '\0'; sub_str_count++; j = 0; } i++; } // 处理最后一个子串(原字符串末尾没有分隔符) result[sub_str_count][j] = '\0'; sub_str_count++; // 输出分割结果 printf("\n分割后的子串如下:\n"); for (int k = 0; k < sub_str_count; k++) { printf("%s\n", result[k]); } return 0; }
一些关键细节说明:
- 安全的字符串读取:用
fgets替代gets,同时通过strcspn去除输入末尾的换行符,避免干扰后续的分割逻辑 - 二维数组的使用:这里是静态定义的二维数组,如果你的场景中原字符串很长、分割后的子串数量/长度不确定,可以改用
malloc动态分配内存,避免栈溢出 - 分隔符处理:用
scanf(" %c", &sep)读取分隔符时,前面的空格是为了跳过输入原字符串后留在输入缓冲区的换行符,防止误把换行符当成分隔符
你可以直接运行这段代码测试,输入示例中的jasf@fjaf@afsj和分隔符@,就能得到你想要的输出啦~
内容的提问来源于stack exchange,提问作者nim
相关产品推荐
相关产品推荐

