在VS2013中处理这段小代码,但由于某种原因它没有print.it似乎-1> strlen(str)
任何人都知道我做错了什么
char *str="abcd";
if(-1<strlen(str))
printf("The size of the string is %d", strlen(str));
return 0;
答案 0 :(得分:10)
任何人都知道我做错了什么
strlen()
返回size_t
,这是一个无符号整数类型。 -1
被解释为无符号整数是一个较大的值,因此它最终会大于字符串的长度。您可以使用-Wsign-compare
中的gcc
标记和其他一些编译器在您尝试比较有符号和无符号值时发出警告。
此外,将字符串的长度与-1
进行比较并没有多大意义。长度永远不会是负面的;它的总是将是0
或更高。因此,您可能希望重写代码以针对0
进行测试,或者正确实施您尝试测试的任何条件。
if(-1<strlen(str)) printf("The size of the string is %d", strlen(str));
在此代码中,您可能会合理地期望测试始终成功并执行printf()
,因为长度始终为0
或更长。但是您发现测试确实失败并且printf()
从未发生,因为-1
被提升为无符号,因此可以将其与size_t
进行比较。简单的解决方案是完全删除条件:您知道测试将始终成功,因此不需要它。只需删除if
* :
printf("The size of the string is %zu", strlen(str));
* 另外,将打印格式说明符从%d
更改为%zu
,因为Matt McNabb在评论中指出,您正在尝试打印size_t
。
答案 1 :(得分:4)
strlen(str)
返回无符号整数。将有符号整数与无符号整数进行比较时,编译器会将有符号值转换为无符号值。转换为无符号时,-1
变为2^32 - 1
(假设strlen返回32位整数),这大于您要比较的字符串的长度。
答案 2 :(得分:4)
strlen
返回size_t
类型的值。这是一种无符号整数类型。
当将有符号值与相应的无符号类型的值进行比较时,C中的规则是将有符号值转换为无符号值。
如果值的大小不同,例如,如果您的系统有4字节int
和8字节size_t
,那么规则是将较小类型的值转换为更大类型的价值。
无论哪种方式,这都意味着-1
转换为size_t
,从而产生SIZE_MAX
这是一个很大的正值。 (无符号类型不能保存负值)。
这个大的正值大于字符串的长度,因此小于比较返回false。