分段错误 - 拆分字符串

时间:2016-09-24 15:52:23

标签: c segmentation-fault

请帮我修复下面的代码。不确定分段错误的位置。

 char str[] = "00ab00,00cd00";
 char **strptr;
 int i;

 strptr = malloc(sizeof(char*) * 2);

 strcnt = 0;
 int j=0;
 for(i=0;i<sizeof(str);i++) {

   char c = *(str+i);
   printf("%c", c);

   if(c==',') {
     strcnt++;
     j=0;
   }

   strptr[strcnt][j++] = c;

 }

请忽略我糟糕的编码:)

PS:我知道可以轻松地使用strtok()分割。

1 个答案:

答案 0 :(得分:0)

  

不确定分段错误的位置

正如其他人在评论中提到的那样,您没有为指针strptr[0]strptr[1]分配内存,但是,您正试图访问它们。这会导致分段错误。

使用for循环初步将内存分配给strptr[0]strptr[1]

strptr = malloc(sizeof(char*) * 2);
for(i = 0; i < 2; i++) //here, initialise each to 1 byte
{
    strptr[i] = malloc(1); 
}
strcnt = 0;

以下是关于how to initialise a pointer to a pointer的问题。

然后,在使用realloc()函数添加其他字符时,在每个步骤调整它们的大小。

for(i = 0, j = 0; i < sizeof(str); i++) 
{

   strptr[strcnt] = realloc(strptr[strcnt], j + 2); 
   //here, you resize each time to provide space for additional character using realloc() 
   char c = *(str + i);

   printf("%c", c);

   if(c == ',') 
   {
     ++strcnt;
     j=0;
     continue; //use a continue here
   }

   strptr[strcnt][j] = c;
   strptr[strcnt][++j] = '\0'; 
   //to provide null terminating character at the end of string (updated to next position at every iteration)
}

不要忘记free()已分配的内存

for( i=0; i<2; i++)
{
    printf("%s\n", strptr[i]); //just to display the string before `free`ing
    free(strptr[i]);
}

free(strptr);

你的代码总是这样:

char str[] = "00ab00,00cd00";
char **strptr;

int i, j;
int strcnt; 

strptr = malloc(sizeof(char*) * 2);
for(i = 0; i < 2; i++)
{
    strptr[i] = malloc(1); 
}
strcnt = 0;


for(i = 0, j = 0; i < sizeof(str); i++) 
{

   strptr[strcnt] = realloc(strptr[strcnt], j + 2); 
   char c = *(str + i);

   printf("%c", c);

   if(c == ',') 
   {
     ++strcnt;
     j=0;
     continue;
   }

   strptr[strcnt][j] = c;
   strptr[strcnt][++j] = '\0';
}

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

free(strptr);

return 0;