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

时间:2019-10-05 16:25:55

标签: c string pointers string-length strlen

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

3 个答案:

答案 0 :(得分:3)

strlen function返回的是Rails.application.config.assets.precompile += %w( application.js ) , 因此您应该使用它来存储其返回值。

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

答案 1 :(得分:2)

这不是错误,并且在您添加了函数声明和预处理器指令的情况下,代码可以正常工作。这是警告您的编译器会告诉您,由于unsignedsigned的转换是特定于编译器而非语言的,因此转换时可能会有一些数据更改。

C的数据类型为size_t,它能够存储C中最大的数据大小,并且在像<stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>, <wchar.h>这样的几个预处理器中定义,并且是32位unsigned int的别名编译器,并且是64位编译器中unsigned long long的别名。优良作法是添加unsignedsize_t之类的其他信息,以实现构建项目时所需的跨平台性能。

答案 2 :(得分:1)

我认为您可以通过将int换成unsigned int来解决此问题。 (不是完美的解决方案) int变量可能是负值,因此给该变量分配任何值都是不安全的。如果将无符号值分配给int,则可能会导致溢出,这非常危险。