我对strlen
的行为很困惑,下面的for循环在尝试时永远不会结束(不添加break
(,而I<-2应在第一步中返回False。
它与我的编译器有关吗?我误解了什么?
#include <stdio.h>
#include <string.h>
int main()
{
char a[] = "longstring";
char b[] = "shortstr";
printf("%dn", strlen(b) - strlen(a)); // print -2
for (int i = 0; i < strlen(b) - strlen(a); i++)
{
printf("why print this, %d %dn", i, strlen(b) - strlen(a));
break;
}
return 0;
}
输出
-2
why print this, 0 -2
printf 调用中的转换说明符
printf("%dn", strlen(b) - strlen(a)); // print -2
不正确。函数strlen
返回无符号整数类型size_t
的值。因此,这个表达式strlen(b) - strlen(a)
也具有类型size_t
。所以你需要写
printf("%dn", ( int ) strlen(b) - ( int )strlen(a) ); // print -2
或
printf("%zun", strlen(b) - strlen(a)); // print a big positive value.
在针对环路的条件下
for (int i = 0; i < strlen(b) - strlen(a); i++)
如上所述的表达式CCD_ 7具有无符号整数类型CCD_。所以它的值不能是负值,而是代表一个大的正值。
再次相反,你需要写
for (int i = 0; i < ( int )strlen(b) - ( int )strlen(a); i++)
或者你可以写
for ( size_t i = 0; i + strlen( a ) < strlen(b); i++)
strlen(b) - strlen(a);
是负数
并且CCD_ 10是0或+ve
因此,环路
for (int i = 0; i < strlen(b) - strlen(a); i++)
永远不会结束为i
(+ve(永远不会是-ve