将 const *char 传递给 strlen() 表示我正在传递 unsigned long

passing const *char to strlen() says i am passing unsigned long

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>

您需要 #include <string.h> 才能获得 strlen() 的正确定义。

隐式声明是过去几年的一个可怕错误。

总是用gcc -Wall -Werror编译。


此外,returnStrings 是一个 NULL 指针,您永远不会分配内存,但会尝试取消引用它。


另外,这是错误的:

returnStrings[sizeof(returnStrings)/sizeof(returnStrings[0])]

您可能在谷歌上搜索了 "C get size of array` and applied that pattern, but ignored the warning that said something like "这仅适用于 数组 而不适用于指针。如果你在指针上使用它,它会编译,但给出不正确的结果。"


另外,这是错误的:

... += str[i]

您不能使用 += 运算符将字符附加到 C 中的 "string"。这将操纵指针,这根本不是您想要的。

除了您缺少 <string.h> 的声明之外,这似乎是您的错误。

strtok() 不是更适合你想要的吗?既然你提到你想把一个句子拆分成一个也是字符串的单词数组?

只是为了解释错误信息:

这并不是说您正在 传递 unsigned long 函数。它说的是你隐式声明函数 strlen,它应该具有类型 unsigned long (const char *) - 也就是说,它应该是一个接受一个类型 const char * 的参数的函数并且 returns unisgned long。根据 C 标准,它实际上应该是 return size_t,所以大概 size_tunsigned long 在您的平台上是相同的类型。

如果您真的想了解更多有关隐式声明的信息,请参阅 Are prototypes required for all functions in C89, C90 or C99?。为了(过度)简化,如果您使用尚未声明的函数(对于标准库函数,这是通过包含适当的标准头文件来完成的),编译器会为您声明它;但是,粗略地说,它根据一组固定的规则对函数的参数和 return 类型进行猜测,而这种猜测通常是错误的。

但是知道隐式声明是不好的并且应该始终从您编写的任何代码中消除就足够了。