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

per*_*man 0 c strlen

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;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试制作一个可以将句子(字符串)拆分为单词数组(也是字符串)的函数,但它不会编译并显示error: implicitly declaring library function 'strlen' with type 'unsigned long (const char *)' [-Werror,-Wimplicit-function-declaration]. 它说我正在输入一个 unsigned long 作为 strlen() 的参数,但我不是。我有#include <stdio.h>我的代码。

Jon*_*art 5

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

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

总是用gcc -Wall -Werror.


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


另外,这是错误的:

returnStrings[sizeof(returnStrings)/sizeof(returnStrings[0])]
Run Code Online (Sandbox Code Playgroud)

您可能在 google 上搜索了“C 获取数组大小”并应用了该模式,但忽略了诸如“这仅适用于数组而不适用于指针”之类的警告。如果你在指针上使用它,它会编译,但会给出错误的结果。”


另外,这是错误的:

... += str[i]
Run Code Online (Sandbox Code Playgroud)

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

  • `-Wall` 甚至没有*开始*启用“所有”警告。根据手册,它是“所有”**简单**警告...以`-Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogic-op -Wmissing-declarations - 之类的东西开始Wredundant-decls -Wshadow`,然后检查您的编译器版本的手册以找到“数十个”您“可以”使用的其他警告。尽可能多地启用它们。编译器是你的朋友。(和+1。) (2认同)