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