Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法获取arr[]的长度:隐式转换丢失整数精度:';无符号长';至';int';斯特伦(arr) 隐式转换丢失整数精度:将“unsigned long”转换为“int”_C_String_Pointers_String Length_Strlen - Fatal编程技术网

C 无法获取arr[]的长度:隐式转换丢失整数精度:';无符号长';至';int';斯特伦(arr) 隐式转换丢失整数精度:将“unsigned long”转换为“int”

C 无法获取arr[]的长度:隐式转换丢失整数精度:';无符号长';至';int';斯特伦(arr) 隐式转换丢失整数精度:将“unsigned long”转换为“int”,c,string,pointers,string-length,strlen,C,String,Pointers,String Length,Strlen,我想知道单词的长度[] 但它向我展示了这一点。我怎样才能修好它 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);

我想知道单词的长度[] 但它向我展示了这一点。我怎样才能修好它

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 "";
}
返回的是
size\u 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 "";
}

这不是一个错误,如果您添加了函数声明和预处理器指令,代码将完全正常工作。这是一个警告,您的编译器告诉您,转换过程中可能会有一些数据更改,因为
无符号
有符号
的转换是特定于编译器的,而不是特定于语言的


C有一个数据类型
size\t
,它能够在C中存储尽可能大的数据大小,并在一些预处理器中定义,如
,,
,是32位编译器中
无符号int
的别名,也是64位编译器中
无符号long
的别名。一个很好的做法是添加额外的信息,如
unsigned
size\u t
,以实现构建项目时所需的跨平台性能。

我认为您可以通过将
int
替换为
unsigned int
来修复它。(不是完美的解决方案)
int
变量可能是负值,因此为该变量赋值是不安全的。如果将无符号值赋给int,可能会导致溢出,这是非常危险的。

这不是错误,您可以处理它。编译器只是提醒您,类型为unsigned long的strlen()返回的值正在隐式转换为int类型,int类型是用于存储该值的变量的类型。如果不支持,则可以使用
%lu
,但它仍然不能保证工作。@Arusekk另一种方法是使用
size\u t
和转换:
printf(“%lu”,(无符号长)字长度)。这种方法有导致溢出的风险,但不会调用未定义的行为。
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 "";
}