C中使用strlen比较字符串长度
Comparison of string lengths in C using strlen
我对 strlen
的行为感到很困惑,下面的 for 循环在尝试时永远不会结束(不添加 break
),而 i < -2 应该 return第一步错误。
是不是和我的编译器有关?我误会了什么?
#include <stdio.h>
#include <string.h>
int main()
{
char a[] = "longstring";
char b[] = "shortstr";
printf("%d\n", strlen(b) - strlen(a)); // print -2
for (int i = 0; i < strlen(b) - strlen(a); i++)
{
printf("why print this, %d %d\n", i, strlen(b) - strlen(a));
break;
}
return 0;
}
输出
-2
why print this, 0 -2
本次 printf 调用中的转换说明符
printf("%d\n", strlen(b) - strlen(a)); // print -2
不正确。函数strlen
returns 一个无符号整数类型的值size_t
。所以这个表达式 strlen(b) - strlen(a)
也有类型 size_t
。所以你需要写
printf("%d\n", ( int ) strlen(b) - ( int )strlen(a) ); // print -2
或
printf("%zu\n", strlen(b) - strlen(a)); // print a big positive value.
在for循环的条件下
for (int i = 0; i < strlen(b) - strlen(a); i++)
上面提到的表达式strlen(b) - strken(a)
具有无符号整数类型size_t
。所以它的值不能为负,代表一个很大的正值。
同样你需要写
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);
为负数
和i
是0或+ve
因此循环
for (int i = 0; i < strlen(b) - strlen(a); i++)
永远不会结束,因为 i
(+ve) 永远不会是 -ve
我对 strlen
的行为感到很困惑,下面的 for 循环在尝试时永远不会结束(不添加 break
),而 i < -2 应该 return第一步错误。
是不是和我的编译器有关?我误会了什么?
#include <stdio.h>
#include <string.h>
int main()
{
char a[] = "longstring";
char b[] = "shortstr";
printf("%d\n", strlen(b) - strlen(a)); // print -2
for (int i = 0; i < strlen(b) - strlen(a); i++)
{
printf("why print this, %d %d\n", i, strlen(b) - strlen(a));
break;
}
return 0;
}
输出
-2
why print this, 0 -2
本次 printf 调用中的转换说明符
printf("%d\n", strlen(b) - strlen(a)); // print -2
不正确。函数strlen
returns 一个无符号整数类型的值size_t
。所以这个表达式 strlen(b) - strlen(a)
也有类型 size_t
。所以你需要写
printf("%d\n", ( int ) strlen(b) - ( int )strlen(a) ); // print -2
或
printf("%zu\n", strlen(b) - strlen(a)); // print a big positive value.
在for循环的条件下
for (int i = 0; i < strlen(b) - strlen(a); i++)
上面提到的表达式strlen(b) - strken(a)
具有无符号整数类型size_t
。所以它的值不能为负,代表一个很大的正值。
同样你需要写
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);
为负数
和i
是0或+ve
因此循环
for (int i = 0; i < strlen(b) - strlen(a); i++)
永远不会结束,因为 i
(+ve) 永远不会是 -ve