gpt4 book ai didi

c - 在 C 中,如何在函数中动态构建字符串数组并返回给调用者

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

RHEL6

我正在尝试在动态构建字符串数组的 C 子例程中实现 perl 拆分函数。我的尝试因段错误而失败。但是,如果我在 for 循环中注释掉 printf 语句,它不会失败(可能暗示段错误是在它的构建位置而不是如何构建的)

这里是...

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

int split(char *s, char **arr);


void main(int argc, char* argv[])
{
int x;
int arrsz;
char str[]="aaa:bbb:ccc";
char **arr;


arrsz=split(str,arr);


for(x=0;x<arrsz;x++) {
printf("%s\n",arr[x]);
}

exit(0);
}

/***********************************/
int split(char *str, char **arr) {

int arrsz=0;
char delim[2] = ":";
char *tok;

arr = malloc(sizeof(char **));
arr[0] = malloc(1);
arr[0] = '\0';

tok = strtok(str,delim);
while(tok != NULL) {
arrsz++;
arr = (char **)realloc(arr,(arrsz*sizeof(char *))+1);
arr[arrsz-1] = malloc((sizeof(char)*strlen(tok))+1);
strcpy(arr[arrsz-1],tok);
arr[arrsz]=malloc(1);
arr[arrsz]='\0';

tok = strtok(NULL,delim);
}

return(arrsz);
}

我认为问题在于我如何将“arr”传递给拆分函数,或者它是如何在函数中被接收和使用的。我这样说是因为如果我将函数体移动到 main,它就在那里工作。

我尝试在函数内部处理 arr,因为它是一个 (char ***),但这没有用。

那里的 C 语言专家可以让我明白吗?

最佳答案

主要错误是您应该将指向字符串列表的指针传递给拆分函数,而不是字符串列表本身,因此您应该使用 ***arr:

int split(char *str, char ***arr);

并且您应该使用 & 在 main 中传递指针:

...
arrsz=split(str,&arr);
...

在函数中,您可以使用双指针来避免混淆,并在最后将该指针分配给参数:

int split(char *str, char ***arrreturn) {
char **arr; //Use this strings list to add the strings

...

*arreturn = arr;
return(arrsz);
}

-您不应该在需要插入字符串的任何时候调用 realloc,但您可以根据需要扩大它的大小并增加其维度。

-如果你有一个长度的变量,我看不到在列表末尾分配'\0'的需要

-您可以使用 strdup 而不是 malloc-strcpy 函数:

char *first = "ciao";
char *str = malloc(strlen(first) * sizeof(char));
strcpy(str, first);

等于:

char *first = "ciao";
char *str = strdup(first);

我更正了你的代码:

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

int split(char *str, char ***arrreturn);


void main(int argc, char *argv[]) {
int x;
int arrsz;
char str[] = "aaa:bbb:ccc";
char **arr;


arrsz = split(str, &arr);


for (x = 0; x < arrsz; x++) {
printf("%s\n", arr[x]);
}

exit(0);
}

/***********************************/
int split(char *str, char ***arrreturn) {

int arrsz = 1;
int len = 0;
char delim[2] = ":";
char *tok;
char **arr;

arr = malloc(sizeof(char **));

tok = strtok(str, delim);
while (tok != NULL) {
len++;
if (len >= arrsz) {
arrsz *= 2;
arr = realloc(arr, arrsz * sizeof(char **));
}
arr[len - 1] = strdup(tok);
tok = strtok(NULL, delim);
}
*arrreturn = arr;
return (len);
}

关于c - 在 C 中,如何在函数中动态构建字符串数组并返回给调用者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49697227/

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