0

我想用指针把一个句子分成单词。

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

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;
}
4

2 回答 2

3

有几个问题:

有了这条线:

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

您只能存储 2 个字,因为您只为 2 个char *指针分配内存。但实际上你存储的不止这些。

当您尝试最后一个单词时,您的内部while循环尝试读取无效内存,因为它会尝试查找' '空间,但它会被'\0'.

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;
}
于 2012-09-10T04:00:48.007 回答
1
char **temp=(char **)malloc(2*sizeof(char *));

您分配了 2 个指针。您的输入字符串有超过 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。我建议不要返回堆分配并传递常量字符串,而是查看一个类似strsep()(更好的版本strtok())的接口,它会修改调用者的缓冲区。

更新: @Rohan 关于返回值问题也是正确的。如果你继续这样做temp++,你需要记住分配开始的原始位置,并将其返回。虽然,我会重新审视strsepor strtok_r

于 2012-09-10T03:55:59.297 回答