鱼C论坛

 找回密码
 立即注册
查看: 1028|回复: 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 编辑
#include <stdio.h>
#include <stdlib.h>

const int arrMax = 1024;

typedef struct ChatXX_length{
    char** paths;
    int length;
}ChatXX_length;
void printChatXX(ChatXX_length data){
    int i = 0;
    char c[arrMax];
    for(;i<data.length;++i){
        printf("%s\n", data.paths[i]);
    }
}
ChatXX_length split(const char *data, const char *_flag);

int main()
{
    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",
         f[]="0x69";
    ChatXX_length c=split(d, f);
    printChatXX(c);
    return 0;
}

ChatXX_length split(const char *data, const char *_flag)
{
    ChatXX_length returnValue;
    char** paths;
    int i = 0, j = 0, k = 1, l=0, flagIndex[arrMax],flagLenght;
    //匹配数据
    for (i = 0; data[i] != 0; ++i, j = 0){
        if (data[i] == _flag[j]){
            for (j = 1; _flag[j] != 0; ++j){
                if(_flag[j] != data[i+j]){//未能匹配到
                    break;
                }
            }
            if (_flag[j] == 0){//匹配成功
                flagIndex[k-1]=i;
                i+=j;
                ++k;
                flagLenght=j;
            }
        }
    }
    flagIndex[k-1]=i;
    //分配空间
    paths = malloc(sizeof(char*)*k);
    paths[0] = malloc(sizeof(char) * flagIndex[0]);
    for(i=1; i<k; ++i){
        paths[i] = malloc(1+sizeof(char) * (flagIndex[i] - flagIndex[i-1]));
    }
    //抄入数据
    for(j = 0, l = 0; j < flagIndex[0]; ++j, ++l){
        paths[0][l]=data[j];
    }
    paths[0][l]=0;
    for(i = 0; i < k-1; ++i){
        for(j = flagIndex[i]+flagLenght, l = 0; j < flagIndex[i+1]; ++j, ++l){
            paths[i+1][l]=data[j];
        }
        paths[i+1][l]=0;
    }
    returnValue.paths=paths;
    returnValue.length=k;
    return returnValue;
}

我太菜了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-2 21:20:41 | 显示全部楼层
先用 for 循环找到 每一个 分隔符的位置
然后 .substr()  (得加 #include<cstring> 头文件)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

额 抱歉 我没说清楚 得需要用C语言实现 您说的是C++的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那你可以试试用一个 二位字符数组来存放分割好的字符数组
.substr 就用 for 循环来代替
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

写的比较丑。
int subcount(const char *haystack, const char *needle) {
    int count = 0;
    int needle_length = strlen(needle);
    const char *tmp = haystack;
    while (tmp = strstr(tmp, needle)) {
        count++;
        tmp += needle_length;
    }
    return count;
}

char **split(const char *haystack, const char *needle) {
    int count = subcount(haystack, needle);
    if (0 == count) {
        return 0;
    }
    int index = 0;
    int needle_length = strlen(needle);
    char **results = (char **) malloc(sizeof(char *) * (count + 1 + 1));
    memset(results, 0, sizeof(char *) * (count + 1 + 1));
    const char *start = haystack, *end = 0;
    while ((end = strstr(start, needle)) != 0) {
        results[index] = (char *) malloc(sizeof(char) * (end - start + 1));
        memcpy(results[index], start, (end - start) * sizeof(char));
        results[index][end - start] = '\0';
        index += 1;
        start = end + needle_length;
    }
    results[index] = strdup(start);
    return results;
}

int main() {
    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";
    char *needle = "0x69";
    char **results = split(haystack, needle);
    if (results == 0) {
        printf("needle not found\n");
        return 0;
    }
    char **tmp = results;
    for (; tmp != 0; tmp++) {
        printf("%s\n", *tmp);
    }
    tmp = results;
    for (; tmp != 0; tmp++) {
        free(*tmp);
    }
    free(results);
    return 0;
}

output
ip route add 192.168.3.10 
 ip route add 192.168.3.20 
 ip route add 192.168.3.10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

const int arrMax = 1024;

typedef struct ChatXX_length{
    char** paths;
    int length;
}ChatXX_length;
void printChatXX(ChatXX_length data){
    int i = 0;
    char c[arrMax];
    for(;i<data.length;++i){
        printf("%s\n", data.paths[i]);
    }
}
ChatXX_length split(const char *data, const char *_flag);

int main()
{
    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",
         f[]="0x69";
    ChatXX_length c=split(d, f);
    printChatXX(c);
    return 0;
}

ChatXX_length split(const char *data, const char *_flag)
{
    ChatXX_length returnValue;
    char** paths;
    int i = 0, j = 0, k = 1, l=0, flagIndex[arrMax],flagLenght;
    //匹配数据
    for (i = 0; data[i] != 0; ++i, j = 0){
        if (data[i] == _flag[j]){
            for (j = 1; _flag[j] != 0; ++j){
                if(_flag[j] != data[i+j]){//未能匹配到
                    break;
                }
            }
            if (_flag[j] == 0){//匹配成功
                flagIndex[k-1]=i;
                i+=j;
                ++k;
                flagLenght=j;
            }
        }
    }
    flagIndex[k-1]=i;
    //分配空间
    paths = malloc(sizeof(char*)*k);
    paths[0] = malloc(sizeof(char) * flagIndex[0]);
    for(i=1; i<k; ++i){
        paths[i] = malloc(1+sizeof(char) * (flagIndex[i] - flagIndex[i-1]));
    }
    //抄入数据
    for(j = 0, l = 0; j < flagIndex[0]; ++j, ++l){
        paths[0][l]=data[j];
    }
    paths[0][l]=0;
    for(i = 0; i < k-1; ++i){
        for(j = flagIndex[i]+flagLenght, l = 0; j < flagIndex[i+1]; ++j, ++l){
            paths[i+1][l]=data[j];
        }
        paths[i+1][l]=0;
    }
    returnValue.paths=paths;
    returnValue.length=k;
    return returnValue;
}

我太菜了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-3 18:07:05 | 显示全部楼层
strsep函数应该可以做到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我运行这个代码确实出结果 但是出结果后代码就崩了 不正常退出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

可以的 很强
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

上面的 print 也修改一下。都封装成函数。试一下吧,我推测是这里的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 17:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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