我正在尝试创建一个 split()
函数,它将 char*
拆分为二维数组或 char**
void split(char* str, char d, char** into)
{
if(str != NULL || into != NULL)
{
int n = 0;
int c = 0;
for(int i = 0; str[c] != '\0'; i++,c++)
{
into[n][i] = str[c];
if(str[c] == d)
{
into[n][i] = '\0';
i = 0;
++n;
}
}
}
}
int main()
{
char** sa = (char**)malloc(50*sizeof(char*));
memory.allocarr(sa, 512, 50);
split("Hello;World;", ';', sa);
puts(sa[0]);
return 0;
}
memory.allocarr
是指向下面函数的结构中的指针
void memory_allocate_array(char** pointers, int bytes, int slots) // memory.allocarr
{
int i = 0;
while(i <= slots)
{
pointers[i] = (char*)calloc(1, bytes);
++i;
}
}
我的函数仅拆分并填充数组的第一个槽(sa[0]
)
puts(sa[0]); // Prints "Hello"
puts(sa[1]); // Prints ""
puts(sa[2]); // Prints "" ...
我试过调试它
for(int i = 0; str[c] != '\0'; i++,c++)
{
printf("n:%d\ti:%d\tc:%d\n",n,i,c);
into[n][i] = str[c];
if(str[c] == d)
{
into[n][i] = '\0';
i = 0;
++n;
}
puts(into[n]);
}
Output
n:0 i:0 c:0
H
n:0 i:1 c:1
He
n:0 i:2 c:2
Hel
n:0 i:3 c:3
Hell
n:0 i:4 c:4
Hello
n:0 i:5 c:5
n:1 i:1 c:6
n:1 i:2 c:7
n:1 i:3 c:8
n:1 i:4 c:9
n:1 i:5 c:10
n:1 i:6 c:11
我还是不明白到底出了什么问题,你能帮我弄清楚吗?
最佳答案
你有两个问题。
第一个是次要的,是个逻辑错误:
if(str != NULL || into != NULL)
只有当 str
和 into
都不为 NULL
时,您才想进行拆分。所以
正确的条件是:
if(str != NULL && into != NULL)
记住 a || b
等同于 !a && !b
。
第二个问题在这里:
if(str[c] == d)
{
into[n][i] = '\0';
i = 0; // <--- here
++n;
}
思路是可以的,但是当你将i
重置为0时,下一次迭代会执行,但是
在此之前,for
循环的 i++,c++
也会执行。为了
第二次、第三次、第四次等迭代 i
从 1 开始。因为你使用 calloc
进行分配
你的内存中,into[n][i]
都是 0 而 into[n][i] = str[c];
在第二个
迭代正在执行 into[n][1] = str[c]
。所以你正在创建这个字符串:
+----+---+---+---+---+---+----+
into[n]: | \0 | W | o | r | l | d | \0 |
+----+---+---+---+---+---+----+
for all n >= 1
字符串中的第一个字符已经是'\0'终止字节,所以
puts
打印一个空行。
如何解决?像这样:
if(str[c] == d)
{
into[n][i] = '\0';
i = -1;
++n;
}
因此当第二次、第三次等迭代开始时,i
为 0。
我使用了你的代码并进行了修复,我得到了 Hello
和 World
是。
另外不要忘记释放所有分配的内存。写一个函数 以双指针作为参数,它的长度,类似于 这个:
void free_string_matrix(char **matrix, size_t len)
{
if(matrix == NULL || *matrix == NULL)
return;
for(size_t i = 0; i < len; ++i)
free(matrix[i]);
free(matrix);
}
关于c - 实现 2D split() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49122182/