c - 实现 2D split() 函数

标签 c arrays multidimensional-array split

我正在尝试创建一个 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)

只有当 strinto 都不为 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。

我使用了你的代码并进行了修复,我得到了 HelloWorld 是。

另外不要忘记释放所有分配的内存。写一个函数 以双指针作为参数,它的长度,类似于 这个:

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/

相关文章:

python - 在python中获取具有相同值的所有行?

ruby - 多维数组中数字之间的百分比变化

c++ - 将自定义大小的多维数组传递给函数

sql-server - 在 Powershell 中将 SQL 查询作为数组返回

C 内存中的二维动态数组

c - 在C中编辑或删除PDF标题信息

c - 并非for循环中的所有指令都被执行

c++ - Fork off more processes as previous finish,直到达到最大值

c - 获取列表元素的函数 - C

php - 尝试在 PHP 中组合数组中的值