我在写一个函数,它可以拆分一个字符串,然后返回一个数组,这个数组应该以一个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);
}
预期的结果是一个字符串数组,应该在标准输出中打印出来,但是我得到的是一个分段默认值。
2条答案
按热度按时间hs1rzwqc1#
您正在向ptr分配一维数组,
但它是在2D中访问的
这绝对是个问题。
7rfyedvj2#
顺便说一句,为什么不使用标准的strtok()?工作代码如下