在 C 语言中,我们可以使用 strlen() 函数来获取一个字符串的字节长度。strlen,是 “string length” 的缩写。
语法:
strlen(字符串)说明:
strlen() 非常方便,它只会统计字符串的 “有效字符”。也就是说,C 语言自动添加的结束符 '\0' 并不会算进去。
注意:
- strlen() 是 “<string.h> 标准库” 的函数,因此在使用之前需要使用 #include <string.h> 引入头文件。
- strlen() 统计的是 “字节长度”,而不是 “字符长度”。
示例 1:C 计算英文字符串长度
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "lvye";
int length = strlen(str);
printf("%d", length);
return 0;
}运行结果如下。
4分析:
对于这个例子来说,我们可以一步到位,而不需要定义一个 length 变量。下面 2 种方式是等价的。
// 方式 1
int length = strlen(str);
printf("%d", length);
// 方式 2
printf("%d", strlen(str));示例 2:C 计算中文字符串长度
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "绿叶网";
int length = strlen(str);
printf("%d", length);
return 0;
}运行结果如下。
9分析:
strlen() 函数本质上就是计算整个字符串所占的字节数。如果是英文字符,每一个字符是占 1 个字节的。在 UTF-8 编码下,一个汉字通常占 3 个字节,所以 3 个汉字占 9 个字节。如果想要统计中文字符的个数,我们还要除以 3 才行。
int length = strlen(str) / 3;注意: 小伙伴们要特别注意,strlen() 返回的是字符串所占的字节数,而不是字符数。对于其他编码格式(如 UTF-8),一个中文字符可能占用 2 个或更多的字节。因此,简单地将 strlen() 的结果除以 2 来统计中文字符的个数只适用于 GBK 编码,而对于其他编码可能不适用。
示例 3:字符串中的空格也算一个字符
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "hello lvye!";
int length = strlen(str);
printf("%d", length);
return 0;
}运行结果如下。
11分析:
怎么回事?str 的长度不应该是 10 吗?怎么是 11 呢?其实空格本身也是作为一个字符来处理的,这一点小伙伴们不要忽略了。
示例 4:“定义的长度” 大于 “实际的长度”
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[100] = "Python";
int length = strlen(str);
printf("%d", length);
return 0;
}运行结果如下。
6分析:
在这个例子中,我们定义了 str 的长度为 100,但 strlen() 函数只会统计字符串的有效长度(即实际看到的长度),这一点小伙伴们一定要记住。
示例 5:3 种字符串定义方式的长度
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[] = "lvye";
char* str2 = "lvye";
char str3[] = {'l', 'v', 'y', 'e', '\0'};
printf("%d\n", strlen(str1));
printf("%d\n", strlen(str2));
printf("%d", strlen(str3));
return 0;
}运行结果如下。
4
4
4分析:
需要注意的是,str3 中的 '\0' 是不能省略的。如果省略 '\0',此时 str3 就不再是一个字符串,而是一个字符数组。
我们把 char str3[] = {'l', 'v', 'y', 'e', '\0'}; 改为 char str3[] = {'l', 'v', 'y', 'e',};,str3 就不再是一个合法的字符串,而只是一个普通的字符数组。此时对它调用 strlen() 会导致未定义行为(结果不可预测),因为 strlen 会一直往后读取内存,直到偶然遇到一个 '\0' 为止。
