【发布时间】:2020-06-17 23:43:15
【问题描述】:
char** strsep(const char* str)
{
char** returnStrings = NULL;
for (int i = 0; i < strlen(str); i++)
{
if (str[i] == ' ') returnStrings[sizeof(returnStrings)/sizeof(returnStrings[0])] = "";
else returnStrings[sizeof(returnStrings)/sizeof(returnStrings[0])] += str[i];
}
return returnStrings;
}
我正在尝试制作一个可以将句子(字符串)拆分为单词数组(也是字符串)的函数,但它不会编译并显示error: implicitly declaring library function 'strlen' with type 'unsigned long (const char *)' [-Werror,-Wimplicit-function-declaration]。它说我正在输入一个 unsigned long 作为 strlen() 的参数,但我不是。 我的代码中有#include <stdio.h>。
【问题讨论】:
-
“隐式声明”意味着您在使用函数之前忘记包含定义。是否包含定义
strlen的头文件?通常是#include <string.h> -
添加
#include <string.h>以修复有关strlen的警告/错误。否则,将使用默认原型,这与使用冲突。但是,如果你这样做,你会在 yourstrsep和 real 之间产生冲突。考虑将您的函数重命名为稍有不同的名称(例如)my_strsep -
这能回答你的问题吗? warning: implicit declaration of function
-
除了警告之外,此代码表现出未定义的行为;您正在为
NULL指针分配索引。 -
另外,您正在评估
strlen每个 循环迭代-非常 慢。您可以执行以下操作:int len = strlen(str);并改用len。但是,最好在*str != 0;上循环,如:for (; *str != 0; ++str)并将所有str[i]更改为*str。然后,您根本不需要调用strlen[它会在第二次/不必要的时间内传递字符串]。