C strlen() 语法
strlen() 是 C 语言 <string.h> 标准库的一个函数,它用于计算字符串的长度(不包括末尾的空字符 '\0')。
其中,strlen 是 “string length(字符串长度)” 的缩写。
语法:
strlen(str)说明:
strlen() 函数接收单个参数。
str(const char*):是一个字符串的指针。
strlen() 返回一个 size_t 类型的值,表示字符串的长度。其中,size_t 是一种无符号整数类型,一般用于表示大小或长度。
对于 strlen() 函数来说,小伙伴们要清楚以下几点。
- strlen() 只会计算字符串中实际字符的个数,但不包括末尾的空字符 '\0'。
- sizeof 是一个运算符,用于计算变量或类型的内存大小。而 strlen() 是一个函数,只会计算字符串的字符长度。
- 如果想要打印 size_t 类型的数据,应该使用打印格式符 “%zu”。
注意: 在使用 strlen() 时,我们必须要确保传入的字符串以空字符 '\0' 结尾,否则可能导致报错。
C strlen() 摘要
| 使用频率 | 高 |
|---|---|
| 修改字符串 | 否 |
| 官方文档 | 查看 |
C strlen() 示例
接下来,我们通过几个简单的例子来讲解一下 C strlen() 函数是如何使用的。
示例 1:strlen() 计算英文字符串的长度
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "lvye";
size_t length = strlen(str);
printf("%zu", length);
return 0;
}运行结果如下。
4分析:
strlen() 函数本质上就是计算整个字符串所占的字节数(不包括结束符 '\0')。如果是英文字符,每一个字符则占 1 个字节。
示例 2:strlen() 计算中文字符串的长度
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "绿叶网";
size_t length = strlen(str);
printf("字节长度:%zu\n", length);
return 0;
}如果源文件是 UTF-8 编码,那么运行结果如下:
字节长度:9如果源文件是 GBK 编码,那么运行结果如下:
字节长度:6分析:
在 UTF-8 编码中,一个汉字占用 3 个字节。所以 “绿叶网” 占 3 * 3 = 9 个字节。
而在 GBK 编码中,一个汉字占用 2 个字节。所以 “绿叶网” 占 3 * 2 = 6 个字节。
注意: 不要直接用 strlen() 来统计汉字的个数(字数),除非你知道确切的编码格式(不过这一般也是不严谨的)。
示例 3:strlen() 计算空字符串的长度
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "";
size_t length = strlen(str);
printf("%zu", length);
return 0;
}运行结果如下。
0分析:
对于空字符串来说,它的长度为 0。
示例 4:空格也是一个字符
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "hello lvye!";
size_t length = strlen(str);
printf("%zu", length);
return 0;
}运行结果如下。
11分析:
咦,怎么回事呢?str 的长度不应该是 10 吗?怎么是 11 呢?其实空格本身也是作为一个字符来处理的,这一点小伙伴们不要忽略了。
示例 5: “定义的长度” 大于 “实际的长度”
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[100] = "python";
size_t length = strlen(str);
printf("%zu", length);
return 0;
}运行结果如下。
6分析:
在这个例子中,我们定义了 str 的长度为 100,但 strlen() 函数只会统计字符串的有效长度(即看到的长度),这一点小伙伴们一定要记住。
示例 6:3 种创建字符串方式的长度
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[] = "lvye";
char* str2 = "lvye";
char str3[] = {'l', 'v', 'y', 'e', '\0'};
printf("%zu\n", strlen(str1));
printf("%zu\n", strlen(str2));
printf("%zu", strlen(str3));
return 0;
}运行结果如下。
4
4
4分析:
需要注意的是,str3 中的 '\0' 是不能省略的。如果省略 '\0',此时 str3 就不再是一个字符串,而是一个字符数组。
我们把 char str3[] = {'l', 'v', 'y', 'e', '\0'}; 改为 char str3[] = {'l', 'v', 'y', 'e'};,如果对它调用 strlen(str3),那么函数会从数组首地址开始,一直向后读取内存,直到碰巧在内存中遇到一个 0 值为止。
这样会导致 “越界访问(Buffer Overflow)”,返回的长度是不可预测的随机值(可能是 8,也可能是 100,甚至导致程序崩溃)。因此小伙伴们一定要记住,手动构建字符串时,千万不要忘记末尾的 '\0'。
