我想用指针将句子分成单词。
我写了一些代码,但我真的很困惑,因为我得到了分段错误。 请帮助我。 提前谢谢。
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;
}
答案 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++
,你需要记住分配开始的原始位置,然后返回。虽然,我会重新审视strsep
或strtok_r
。