无法获取 arr[] 的长度:隐式转换会丢失整数精度:'unsigned long' 到 'int' for strlen(arr)

Cannot get the length of arr[] : Implicit conversion loses integer precision: 'unsigned long' to 'int' for strlen(arr)

隐式转换失去整数精度:
'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'

什么 strlen function returns 是 size_t, 所以你应该用它来存储它的 return 值。

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 格式。 另一种方法是,如果字符串不会太长,将 return 值转换为 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 "";
}

这不是错误,如果您添加了函数声明和预处理器指令,代码将绝对正常运行。这是一个警告,你的编译器给你可能有一些数据在转换中改变,因为 unsignedsigned 的转换特定于编译器而不是语言。

C 有一个数据类型 size_t,它能够在 C 中存储最大可能的数据大小,并且在 <stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>, <wchar.h> 等几个预处理器中定义,并且是 unsigned int 的别名32 位编译器,是 64 位编译器中 unsigned long long 的别名。为跨平台性能添加 unsignedsize_t 等附加信息是一个很好的做法,这在构建项目时是必需的。

我想你可以通过将 int 换成 unsigned int 来修复它。 (不是完美的解决方案) int 变量可能是负值,所以给这个变量赋值是不安全的。如果给int赋无符号值,可能会造成溢出,非常危险。