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 "";
}