用指针分开句子会导致seg错误

时间:2012-09-10 03:45:27

标签: c pointers

我想用指针将句子分成单词。

我写了一些代码,但我真的很困惑,因为我得到了分段错误。 请帮助我。 提前谢谢。

char **breakstring(char *str)
{
    char **temp=(char **)malloc(5*sizeof(char *));
    char **temp_store = temp;
    while((*str) != '/0')
    {
      while((*str != '\0') && *str!=' ')
      {
      **temp=*str;
      **temp++;
      *str++;
      }

      str++;
      temp++;
    }
    return temp_store;
}

int main()
{
    char **arra;
    char *arr="this is a stupid string";
    arra=breakstring(arr);
    return 0;
}

2 个答案:

答案 0 :(得分:3)

几乎没有问题:

这一行:

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

在为2 char *个指针分配内存时,您只能存储2个字。但实际上你存储的不仅仅是那个。

当您尝试读取最后一个单词时尝试读取无效内存时,您的内部while循环会尝试查找' '空格,但它会被'\0'终止。< / p>

while(*str!=' ')
{
   **temp=*str;
   **temp++;
   *str++;
}

将其更新为:

while((*str != '\0') && *str!=' ')
{
   **temp=*str;
   **temp++;
   *str++;
}

第三,您将返回更新的temp指针。即它已增加并更改为指向最后一个单词。相反,您需要返回temp的原始值。 你可以这样做:

char **breakstring(char *str)
{
    char **temp=(char **)malloc(2*sizeof(char *));
    char **temp_store = temp;
    while((*str) != '/0')
    ....
    return temp_store;
}

答案 1 :(得分:1)

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

你分配了2个指针。您的输入字符串有两个以上的空格。如果您仍想使用动态内存,则必须定期调用realloc以请求更多空间,或者可能引入一些大于2的其他任意最大值。

  while(*str!=' ')
  {
**temp=*str;
**temp++;
*str++;
  }

这说的是“当字符串的当前字符不是空格时,将字符串添加到temp,然后前进。所以,如果你被"This is a ..."调用,你将会结束使用"This is a ...""his is a ...""is is a ..."等。在此循环中,您希望提前str而不指定temp。(您还需要添加条件*str,即while (*str && *str != ' '))在循环之外,您需要*temp++ = str;之类的内容,然后跳过所有空格字符。(您可能还想添加NUL用于停止字符串的终止符,但是您已使用const char *字符串文字调用该函数,因此要保持您可能必须将整个字符串复制到堆上。)

总而言之,我们在这里引入的堆分配量对于字符串操作来说有点像C-like。我建议您不要返回堆分配并传递常量字符串,而是查看像strsep()这样的界面(丑陋的strtok()的更好版本),它会修改调用者的缓冲区。

更新: @Rohan对于返回值问题也是正确的。如果你继续temp++,你需要记住分配开始的原始位置,然后返回。虽然,我会重新审视strsepstrtok_r