gpt4 book ai didi

c - 需要帮助按分隔符拆分字符串(并将分隔符保留在标记列表中)

转载 作者:行者123 更新时间:2023-12-04 22:46:08 25 4
gpt4 key购买 nike

我想用定界符分割一个字符串,并将定界符保留在标记列表中

我有一个功能与 strtok 做同样的事情,但有一个字符串定界符(而不是一组字符),但它不保留定界符并且不能将定界符数组作为参数

这是一个像 strtok 一样将字符串拆分为标记的函数,但需要一个分隔符

static char *strtokstr(char *str, char *delimiter)
{
static char *string;
char *end;
char *ret;

if (str != NULL)
string = str;
if (string == NULL)
return string;
end = strstr(string, delimiter);
if (end == NULL) {
char *ret = string;
string = NULL;
return ret;
}
ret = string;
*end = '\0';
string = end + strlen(delimiter);
return ret;
}

我想要一个 char **split(char *str, char **delimiters_list) 将字符串拆分为一组定界符并将定界符保留在标记列表中

我想我还需要一个函数来计算 token 的数量,这样我就可以malloc 返回我的split 函数

//delimiters是一个包含["&&", "||"的数组和 NULL]split("ls > file&&foo || bar", delimiters) 应返回包含 ["ls > file", "&&", "foo ", "||", "bar 的数组"]

如何实现?

最佳答案

首先,你这里有内存错误:

static char *string;

if (str != NULL)
string = str;
if (string == NULL)
return string;

如果 str 为 NULL,则字符串未初始化,您在比较中使用未初始化的值。

如果你想复制一个字符串,你必须使用strdup函数,=只会复制指针而不是指针内容。


这里有一个方法:

#include <stdlib.h>
#include <string.h>

char *get_delimiters(char *str, char **delims)
{
for (int i = 0; delims[i]; i++)
if (!strncmp(str, delims[i], strlen(delims[i])))
return delims[i];
return NULL;
}

char **split(char *str, char **delimiters)
{
char *string = strdup(str);
char **result = NULL;
int n = 0;
char *delim = NULL;

for (int i = 0; string[i]; i++)
if (get_delimiters(string + i, delimiters))
n++;
result = malloc((n * 2 + 2) * sizeof(char *));
if (!result)
return NULL;
result[0] = string;
n = 1;
for (int i = 0; string[i]; i++) {
delim = get_delimiters(string + i, delimiters);
if (delim) {
string[i] = '\0';
result[n++] = delim;
result[n++] = string + i + strlen(delim);
}
}
result[n] = NULL;
return result;
}

结果:

[0] 'ls > file'
[1] '&&'
[2] 'foo '
[3] '||'
[4] ' bar'

记住 resultstring 是分配的,所以你必须释放 resultresult[0]

关于c - 需要帮助按分隔符拆分字符串(并将分隔符保留在标记列表中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56303807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com