C语言 为什么我会有分割错误

tkclm6bt  于 2023-02-21  发布在  其他
关注(0)|答案(2)|浏览(126)

我在写一个函数,它可以拆分一个字符串,然后返回一个数组,这个数组应该以一个NULL指针结束,但是当我运行这个程序的时候,我遇到了一个分段错误。

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

char **_strtok(char *str, const char *delim);

int main(void)
{
        char *str = "one,two,three/four-five six seven";
        char **ptr = _strtok(str, ",- /");
        int i;

        for (i = 0; ptr[i]; i++)
        {
                printf("%s\n", ptr[i]);
        }
        free(ptr);
        return (0);
}

/**
 * _strtok - function that splits a string and returns
 * an array of each word of the string
 * @str: the string to be parsed
 * @delim: the delimeter
 * Return : an array of each word of the string
 */

char **_strtok(char *str, const char *delim)
{
        char **ptr, *temp;
        int i, j, m, n, k = 0, l = 0;

        temp = malloc(strlen(str) + 1);
        if (temp == NULL)
        {
                printf("ERROR: Memory allocation failed\n");
                exit(1);
        }
        ptr = malloc(strlen(str) * 2);
        if (ptr == NULL)
        {
                printf("ERROR: Memory allocation failed\n");
                exit(1);
        }
        for (i = 0; str[i] != '\0'; i++)
        {
                for (j = 0; delim[j] != '\0'; j++)
                {
                        if (str[i] == delim[j])
                        {
                                temp[l] = '\0';
                                for (m = 0; temp[m] != '\0'; m++)
                                {
                                        ptr[k][m] = temp[m];
                                }
                                ptr[k++][m] = '\0';
                                free(temp);
                                temp = malloc((strlen(str) + 2 - l));
                                if (temp == NULL)
                                {
                                        printf("ERROR: Memory allocation failed\n");
                                        exit(1);
                                }
                                l = 0;
                                break;
                        }
                }
                if (delim[j] == '\0')
                {
                        temp[l++] = str[i];
                }

        }
        temp[l] = '\0';
        for (n = 0; temp[n] != '\0'; n++)
        {
                ptr[k][n] = temp[n];
        }
        ptr[k++][n] = '\0';
        ptr[k] = NULL;
        free(temp);
        return (ptr);
}

预期的结果是一个字符串数组,应该在标准输出中打印出来,但是我得到的是一个分段默认值。

hs1rzwqc

hs1rzwqc1#

您正在向ptr分配一维数组,

ptr = malloc(strlen(str) * 2);

但它是在2D中访问的

ptr[k][m] = temp[m];

这绝对是个问题。

7rfyedvj

7rfyedvj2#

顺便说一句,为什么不使用标准的strtok()?工作代码如下

int main(void)
{
        char *str = "one,two,three/four-five six seven";
        char *sstr = strdup( str ); // duplicate str as strtok will modify input's content

        char *ptr = strtok(sstr,",- /");
        do
        {
                printf("%s\n", ptr);
        } while( ptr=strtok(nullptr, ",- /"));

        free(sstr);
        return (0);
}

$ ./a.exe
one
two
three
four
five
six
seven

相关问题