gpt4 book ai didi

c - 在 C 中通过定界符函数实现拆分字符串

转载 作者:太空宇宙 更新时间:2023-11-04 06:02:20 24 4
gpt4 key购买 nike

我正在尝试用 C 编写一个函数,它接受指向以 '\0' 结尾的连续字符的指针 - 即字符串 - 和单个常量字符定界符,然后输出指向连续指针的指针,每个指针指向一个新字符串。这些新字符串对应于在每个定界符处断开然后正确终止的输入字符串。简而言之,我想动态构建一个字符串数组。

为此,我计划使用 malloc() 来分配我需要的内存。 “父数组”将是 sizeof(char *) * (count + 2) 字节长,以容纳指向每个分隔子字符串的第一个字符的指针,以及一个终止符。同样,每个“子数组”的长度都是 sizeof(char) * (j + 1) 字节,以容纳每个子字符串的所有字符,再加上一个终止符。

到目前为止我的代码是这样的。

#include <stdio.h>
#include <stdlib.h>

char *split(char *string, const char delimiter);

int main(int argc, char *argv[]) {
char *x = split(argv[1], '.');
while (*x) {
printf("%d\n", *x);
}
return 0;
}

char *split(char *string, const char delimiter) {
int length, count, i, j = 0;
while(*(string++)) {
if (*string == delimiter) count++;
length++;
}
string -= length;
char *array = (char *)malloc(sizeof(char *) * (length + 1));
for(i, j = 0; i < (count + 1); i++) {
while(*(string++) != delimiter) j++;
string -= j;
*array = (char *)malloc(sizeof(char) * (j + 1));
while(*(string++) != delimiter) *(*array++) = *(string++);
**array = '\0';
string++;
array += sizeof(char *);
}
*array = '\0';
array -= (sizeof(char *) * (length + 1));
return array;
}

我的问题是为什么编译器会吐出以下错误?

split2.c: In function ‘split’:
split2.c:25: warning: assignment makes integer from pointer without a cast
split2.c:26: error: invalid type argument of ‘unary *’ (have ‘int’)
split2.c:27: error: invalid type argument of ‘unary *’ (have ‘int’)

我的猜测是,当为“父数组”分配内存时,编译器希望将 int 值而不是 char * 存储在那里。如果是这种情况,我该如何正确更正我的代码?

我知道使用 string.h 做这类事情有更简单的方法;我编写这段代码的动机是为了更好地了解指针在 C 中的工作方式。

非常感谢!

最佳答案

我想你想要 array 作为双指针,char **array

char **array = (char **)malloc(sizeof(char *) * (length + 1));

正如您的逻辑所说,您需要一个 char* 数组,每个数组指向一个字符串。所以 array 应该是双指针。如果您进行此修改,也将返回类型更改为 char**

如果你想使用双指针,试试这个:

char **split(char *string, const char delimiter) {
int length = 0, count = 0, i = 0, j = 0;
while(*(string++)) {
if (*string == delimiter) count++;
length++;
}
string -= (length + 1); // string was incremented one more than length
char **array = (char **)malloc(sizeof(char *) * (length + 1));
char ** base = array;
for(i = 0; i < (count + 1); i++) {
j = 0;
while(string[j] != delimiter) j++;
j++;
*array = (char *)malloc(sizeof(char) * j);
memcpy(*array, string, (j-1));
(*array)[j-1] = '\0';
string += j;
array++;
}
*array = '\0';
return base;
}

稍后释放这个数组,比如:

i = 0;
while(base[i]) {
free(base[i]);
i++;
}
free(base);
base = NULL;

关于c - 在 C 中通过定界符函数实现拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17061381/

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