передача const * char в strlen () говорит, что я передаю unsigned long - PullRequest
0 голосов
/ 18 июня 2020
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]. Он говорит, что я ввожу беззнаковый long в качестве параметра для strlen (), но это не так. у меня в коде #include <stdio.h>.

Ответы [ 3 ]

5 голосов
/ 18 июня 2020

Вам нужно #include <string.h>, чтобы получить правильное определение для strlen().

Неявные объявления - ужасная ошибка прошлых лет.

Всегда компилируйте с gcc -Wall -Werror.


Кроме того, returnStrings является указателем NULL, и вы никогда не выделяете память, а пытаетесь разыменовать ее.


Кроме того, это неверно:

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

Вероятно, вы искали в Google запрос «C получить размер массива» и применили этот шаблон, но проигнорировали предупреждение, в котором говорилось что-то вроде «Это работает только для массивов , но не указателей. Если вы используете его для указателя, он будет скомпилирован, но даст неверные результаты. "


Кроме того, это неверно:

... += str[i]

Вы не можете добавить символ к «строка» в C с помощью оператора +=. Это будет управлять указателем, что совсем не то, что вы намереваетесь.

0 голосов
/ 18 июня 2020

Просто чтобы объяснить сообщение об ошибке:

Это не означает, что вы передаете unsigned long функции. В нем говорится, что вы неявно объявляете функцию strlen, которая должна была иметь тип unsigned long (const char *), то есть должна быть функцией, которая принимает один аргумент типа const char * и которая возвращает unisgned long. В соответствии со стандартом C он фактически должен возвращать size_t, поэтому предположительно size_t и unsigned long относятся к одному типу на вашей платформе.

См. Требуются ли прототипы для всех функций в C89, C90 или C99? , если вы действительно хотите узнать больше о том, что такое неявное объявление. Чтобы (более) упростить, если вы используете функцию, которая не была объявлена ​​(что для стандартной библиотечной функции выполняется путем включения соответствующего стандартного файла заголовка), компилятор объявляет ее за вас; но, грубо говоря, он делает предположение согласно фиксированному набору правил относительно аргумента функции и типов возвращаемого значения, и это предположение обычно неверно.

Но достаточно знать, что неявные объявления плохи и должны всегда исключать из любого написанного вами кода.

0 голосов
/ 18 июня 2020

Кроме того, что вам не хватает объявления для <string.h>, что, похоже, является вашей ошибкой.

Разве strtok() не подошло бы вам лучше? Поскольку вы упомянули, что хотите разбить предложение на массив слов, которые также являются строками?

...