鱼C论坛

 找回密码
 立即注册
查看: 1264|回复: 9

[已解决]按某一字符串分割字符串 谢谢了

[复制链接]
发表于 2020-6-2 21:19:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 随风浩荡几万里 于 2020-6-2 21:26 编辑

字符串"ip route add 192.168.3.10 0x69 ip route add 192.168.3.20 0x69 ip route add 192.168.3.10" 以“0x69”为分隔符 分割为
ip route add 192.168.3.10
ip route add 192.168.3.20
ip route add 192.168.3.10
C语言实现
最佳答案
2020-6-3 02:20:25
本帖最后由 Darth_EF 于 2020-6-3 02:21 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. const int arrMax = 1024;

  4. typedef struct ChatXX_length{
  5.     char** paths;
  6.     int length;
  7. }ChatXX_length;
  8. void printChatXX(ChatXX_length data){
  9.     int i = 0;
  10.     char c[arrMax];
  11.     for(;i<data.length;++i){
  12.         printf("%s\n", data.paths[i]);
  13.     }
  14. }
  15. ChatXX_length split(const char *data, const char *_flag);

  16. int main()
  17. {
  18.     char d[]="ip route add 192.168.3.10 0x69 ip route add 192.168.3.20 0x69 ip route add 192.168.3.10",
  19.          f[]="0x69";
  20.     ChatXX_length c=split(d, f);
  21.     printChatXX(c);
  22.     return 0;
  23. }

  24. ChatXX_length split(const char *data, const char *_flag)
  25. {
  26.     ChatXX_length returnValue;
  27.     char** paths;
  28.     int i = 0, j = 0, k = 1, l=0, flagIndex[arrMax],flagLenght;
  29.     //匹配数据
  30.     for (i = 0; data[i] != 0; ++i, j = 0){
  31.         if (data[i] == _flag[j]){
  32.             for (j = 1; _flag[j] != 0; ++j){
  33.                 if(_flag[j] != data[i+j]){//未能匹配到
  34.                     break;
  35.                 }
  36.             }
  37.             if (_flag[j] == 0){//匹配成功
  38.                 flagIndex[k-1]=i;
  39.                 i+=j;
  40.                 ++k;
  41.                 flagLenght=j;
  42.             }
  43.         }
  44.     }
  45.     flagIndex[k-1]=i;
  46.     //分配空间
  47.     paths = malloc(sizeof(char*)*k);
  48.     paths[0] = malloc(sizeof(char) * flagIndex[0]);
  49.     for(i=1; i<k; ++i){
  50.         paths[i] = malloc(1+sizeof(char) * (flagIndex[i] - flagIndex[i-1]));
  51.     }
  52.     //抄入数据
  53.     for(j = 0, l = 0; j < flagIndex[0]; ++j, ++l){
  54.         paths[0][l]=data[j];
  55.     }
  56.     paths[0][l]=0;
  57.     for(i = 0; i < k-1; ++i){
  58.         for(j = flagIndex[i]+flagLenght, l = 0; j < flagIndex[i+1]; ++j, ++l){
  59.             paths[i+1][l]=data[j];
  60.         }
  61.         paths[i+1][l]=0;
  62.     }
  63.     returnValue.paths=paths;
  64.     returnValue.length=k;
  65.     return returnValue;
  66. }
复制代码


我太菜了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-2 21:20:41 | 显示全部楼层
先用 for 循环找到 每一个 分隔符的位置
然后 .substr()  (得加 #include<cstring> 头文件)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-2 21:25:59 | 显示全部楼层
liuzhengyuan 发表于 2020-6-2 21:20
先用 for 循环找到 每一个 分隔符的位置
然后 .substr()  (得加 #include 头文件)

额 抱歉 我没说清楚 得需要用C语言实现 您说的是C++的吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-2 21:29:49 | 显示全部楼层
随风浩荡几万里 发表于 2020-6-2 21:25
额 抱歉 我没说清楚 得需要用C语言实现 您说的是C++的吧

那你可以试试用一个 二位字符数组来存放分割好的字符数组
.substr 就用 for 循环来代替
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-2 22:25:19 | 显示全部楼层
本帖最后由 赚小钱 于 2020-6-2 22:27 编辑

写的比较丑。

  1. int subcount(const char *haystack, const char *needle) {
  2.     int count = 0;
  3.     int needle_length = strlen(needle);
  4.     const char *tmp = haystack;
  5.     while (tmp = strstr(tmp, needle)) {
  6.         count++;
  7.         tmp += needle_length;
  8.     }
  9.     return count;
  10. }

  11. char **split(const char *haystack, const char *needle) {
  12.     int count = subcount(haystack, needle);
  13.     if (0 == count) {
  14.         return 0;
  15.     }
  16.     int index = 0;
  17.     int needle_length = strlen(needle);
  18.     char **results = (char **) malloc(sizeof(char *) * (count + 1 + 1));
  19.     memset(results, 0, sizeof(char *) * (count + 1 + 1));
  20.     const char *start = haystack, *end = 0;
  21.     while ((end = strstr(start, needle)) != 0) {
  22.         results[index] = (char *) malloc(sizeof(char) * (end - start + 1));
  23.         memcpy(results[index], start, (end - start) * sizeof(char));
  24.         results[index][end - start] = '\0';
  25.         index += 1;
  26.         start = end + needle_length;
  27.     }
  28.     results[index] = strdup(start);
  29.     return results;
  30. }

  31. int main() {
  32.     char *haystack = "ip route add 192.168.3.10 0x69 ip route add 192.168.3.20 0x69 ip route add 192.168.3.10";
  33.     char *needle = "0x69";
  34.     char **results = split(haystack, needle);
  35.     if (results == 0) {
  36.         printf("needle not found\n");
  37.         return 0;
  38.     }
  39.     char **tmp = results;
  40.     for (; tmp != 0; tmp++) {
  41.         printf("%s\n", *tmp);
  42.     }
  43.     tmp = results;
  44.     for (; tmp != 0; tmp++) {
  45.         free(*tmp);
  46.     }
  47.     free(results);
  48.     return 0;
  49. }

复制代码


output
  1. ip route add 192.168.3.10
  2. ip route add 192.168.3.20
  3. ip route add 192.168.3.10
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-6-3 02:20:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Darth_EF 于 2020-6-3 02:21 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. const int arrMax = 1024;

  4. typedef struct ChatXX_length{
  5.     char** paths;
  6.     int length;
  7. }ChatXX_length;
  8. void printChatXX(ChatXX_length data){
  9.     int i = 0;
  10.     char c[arrMax];
  11.     for(;i<data.length;++i){
  12.         printf("%s\n", data.paths[i]);
  13.     }
  14. }
  15. ChatXX_length split(const char *data, const char *_flag);

  16. int main()
  17. {
  18.     char d[]="ip route add 192.168.3.10 0x69 ip route add 192.168.3.20 0x69 ip route add 192.168.3.10",
  19.          f[]="0x69";
  20.     ChatXX_length c=split(d, f);
  21.     printChatXX(c);
  22.     return 0;
  23. }

  24. ChatXX_length split(const char *data, const char *_flag)
  25. {
  26.     ChatXX_length returnValue;
  27.     char** paths;
  28.     int i = 0, j = 0, k = 1, l=0, flagIndex[arrMax],flagLenght;
  29.     //匹配数据
  30.     for (i = 0; data[i] != 0; ++i, j = 0){
  31.         if (data[i] == _flag[j]){
  32.             for (j = 1; _flag[j] != 0; ++j){
  33.                 if(_flag[j] != data[i+j]){//未能匹配到
  34.                     break;
  35.                 }
  36.             }
  37.             if (_flag[j] == 0){//匹配成功
  38.                 flagIndex[k-1]=i;
  39.                 i+=j;
  40.                 ++k;
  41.                 flagLenght=j;
  42.             }
  43.         }
  44.     }
  45.     flagIndex[k-1]=i;
  46.     //分配空间
  47.     paths = malloc(sizeof(char*)*k);
  48.     paths[0] = malloc(sizeof(char) * flagIndex[0]);
  49.     for(i=1; i<k; ++i){
  50.         paths[i] = malloc(1+sizeof(char) * (flagIndex[i] - flagIndex[i-1]));
  51.     }
  52.     //抄入数据
  53.     for(j = 0, l = 0; j < flagIndex[0]; ++j, ++l){
  54.         paths[0][l]=data[j];
  55.     }
  56.     paths[0][l]=0;
  57.     for(i = 0; i < k-1; ++i){
  58.         for(j = flagIndex[i]+flagLenght, l = 0; j < flagIndex[i+1]; ++j, ++l){
  59.             paths[i+1][l]=data[j];
  60.         }
  61.         paths[i+1][l]=0;
  62.     }
  63.     returnValue.paths=paths;
  64.     returnValue.length=k;
  65.     return returnValue;
  66. }
复制代码


我太菜了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-3 18:07:05 | 显示全部楼层
strsep函数应该可以做到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-3 18:09:52 | 显示全部楼层

我运行这个代码确实出结果 但是出结果后代码就崩了 不正常退出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-3 18:11:43 | 显示全部楼层

可以的 很强
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-3 19:16:38 | 显示全部楼层
随风浩荡几万里 发表于 2020-6-3 18:09
我运行这个代码确实出结果 但是出结果后代码就崩了 不正常退出
  1. for (; tmp != 0; tmp++) {
  2.     free(*tmp);
  3. }
复制代码

修改成
  1. for (; tmp != 0; tmp++) {
  2.     if (*tmp != 0) {
  3.         free(*tmp);
  4.     }
  5. }
复制代码


上面的 print 也修改一下。都封装成函数。试一下吧,我推测是这里的问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 06:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表