Невозможно получить длину arr []: неявное преобразование теряет целочисленную точность: «unsigned long» в «int» для strlen (arr) - PullRequest
1 голос
/ 05 октября 2019

Неявное преобразование теряет целочисленную точность:
'unsigned long' в 'int'

Я хочу получить длину слова [], но это показывает мне это. Как я могу это исправить?

int main(int argc, const char * argv[]) {

    char test[] = "ls test";
    f_sparce_arg(test);
    return 0;
}
char * f_sparce_arg(char words[]){
    int words_length;
    words_length = strlen(words);   /* warning: Implicit conversion 
                                       integer precision: 'unsigned 
                                       long' to 'int' */

    printf("%d", words_length);
    return "";
}
// warning: Implicit conversion integer precision: 'unsigned long' to 'int'

Ответы [ 2 ]

2 голосов
/ 05 октября 2019

Что strlen Функция возвращает size_t, поэтому вы должны использовать его для хранения возвращаемого значения.

char * f_sparce_arg(char words[]){
    size_t words_length; /* use proper type */
    words_length = strlen(words);

    printf("%zu",words_length); /* the format to print size_t value is %zu */
    return "";
}

К сожалению, формат %zu не поддерживается внекоторые компиляторы или библиотеки. Другой способ, если строка не будет такой длинной, привести возвращаемое значение к int.

char * f_sparce_arg(char words[]){
    int words_length;
    words_length = (int)strlen(words); /* explicitly cast the result to avoid warnings */

    printf("%d",words_length);
    return "";
}
1 голос
/ 05 октября 2019

Это не ошибка, и код будет работать абсолютно нормально, если вы добавили объявление функции и директивы препроцессора. это предупреждение о том, что ваш компилятор дает вам возможность изменить некоторые данные при преобразовании, поскольку преобразование unsigned в signed зависит от компилятора, а не от языка.

C имеет тип данных size_t который способен хранить максимально возможный размер данных в C и определяется в нескольких препроцессорах, таких как <stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>, <wchar.h>, и является псевдонимом для unsigned int в 32-битном компиляторе, а также псевдонимом для unsigned long long в 64-битном компиляторе. Рекомендуется добавлять дополнительную информацию, например unsigned и size_t, для кроссплатформенной производительности, которая требуется при создании проекта.

...