【发布时间】:2018-02-10 02:34:19
【问题描述】:
我正在尝试创建一个 startswith 函数,如果我有一个字符串,则该函数由 "Hello I am kira"
将拆分为第一个单词"Hello" Only
我真的尽了最大努力把它变成这个表格
#include <stdio.h>
unsigned char *startswith(unsigned char *str)
{
char *result;
char *cstr = (char *)str;
for (int i=0; cstr[i] != ' '; i++)
result[i] = cstr[i];
return(result);
}
int main()
{
printf("%s\n",startswith("What is your name momo?"));
return 0;
}
应该打印“在我的想象中”
What
和 newline 然后退出 0
但是我在编译时遇到了未知的神圣错误
Segmentation fault
我不明白为什么会发生这种情况,甚至无法找到问题所在gcc 没有帮助或向我显示警告
stdio.h 标头只是为了不再打印结果
我知道有一种方法可以在不使用任何标准库的情况下实现这一目标,但我需要领先
谢谢!
【问题讨论】:
-
您必须了解内存模型中堆栈的内容。
result是函数的局部变量,作用域以函数本身结束。 -
为此我将它设为指针 (*),顺便说一句,即使在范围内它也不起作用。
-
所以现在你有一个指向一个不存在的位置,因为函数已经退出并且本地人被弹出。你认为这有意义吗?指针并不意味着专用分配,因此您需要堆内存,如下面的答案所述。
-
@KiraSama
char *result;声明了一个没有指向任何地方的未初始化字符指针。您需要分配内存并使result指向该块,例如char *result = calloc (strlen (str) + 1, 1);然后用if (result == NULL) { /* handle error */ }验证分配,然后进入你的for循环。
标签: c function implementation startswith