一句话概括
strlen 是 C 语言标准库中的一个函数,用于计算一个以空字符(\0)结尾的字符串的长度。它返回的是字符串中字符的数量,但不包括结尾的空字符 \0。

详细解释
它是什么?
strlen 是 "string length"(字符串长度)的缩写,它是一个标准库函数,定义在头文件 <string.h> 中,在你的 C 程序中使用 strlen 之前,必须包含这个头文件。
#include <string.h> // 必须包含这个头文件
函数原型
strlen 的函数原型通常是这样的:
size_t strlen(const char *str);
我们来分解一下这个原型:
size_t: 这是返回值的类型。size_t是一个无符号整数类型,专门用于表示大小、长度或索引,它通常是unsigned int或unsigned long,使用无符号类型意味着返回的长度不可能是负数。strlen: 函数名。const char *str: 这是函数的参数。char *: 表示一个指向字符的指针,在 C 语言中,字符串通常被表示为一个指向其第一个字符的指针。const: 这是一个关键字,表示str指向的字符串内容在strlen函数内部不会被修改,这是一种安全承诺,告诉调用者这个函数只会读取字符串,而不会改变它。
它是如何工作的?
strlen 的工作原理非常直观:

- 它接收一个字符串指针(通常是字符数组名)。
- 它从该指针指向的内存地址开始,逐个字节地检查字符。
- 它会一直计数,直到它遇到一个空字符
\0(ASCII 码为 0)。 - 它停止计数,并返回已经计数的字符个数。
重要提示: strlen 不会计算结尾的 \0,它只是通过 \0 来判断字符串的结束位置。
使用示例
下面是一个简单的例子,展示了如何使用 strlen。
#include <stdio.h>
#include <string.h> // 包含 strlen 函数的头文件
int main() {
// 定义一个字符数组(字符串)
char str1[] = "Hello, World!";
// 定义一个指针指向字符串字面量
const char *str2 = "C Programming";
// 使用 strlen 计算字符串长度
size_t len1 = strlen(str1);
size_t len2 = strlen(str2);
// 打印结果
printf("字符串 \"%s\" 的长度是: %zu\n", str1, len1); // 输出 13
printf("字符串 \"%s\" 的长度是: %zu\n", str2, len2); // 输出 14
return 0;
}
内存中的样子(以 str1 为例):
| 内存地址 | 存储的字符 | 说明 |
|---|---|---|
&str1[0] |
'H' | 字符串开始 |
&str1[1] |
'e' | |
&str1[2] |
'l' | |
&str1[3] |
'l' | |
&str1[4] |
'o' | |
&str1[5] |
',' | |
&str1[6] |
' ' | |
&str1[7] |
'W' | |
&str1[8] |
'o' | |
&str1[9] |
'r' | |
&str1[10] |
'l' | |
&str1[11] |
'd' | |
&str1[12] |
'!' | |
&str1[13] |
\0 |
字符串结束符 |
strlen 从 &str1[0] 开始计数,数到 &str1[12] 的 '!',然后在 &str1[13] 遇到了 \0,于是停止,它数了 13 个字符,所以返回 13。
重要注意事项
性能:O(n) 时间复杂度
strlen 必须遍历整个字符串才能找到结尾的 \0,它的执行时间与字符串的长度成正比,如果一个字符串很长,strlen 就会比较慢,在性能敏感的代码中,如果多次使用同一个字符串的长度,最好先将结果存储在一个变量中,而不是反复调用 strlen。
// 低效的做法
for (int i = 0; i < strlen(my_string); i++) {
// 每次循环都会重新计算 strlen
}
// 高效的做法
size_t len = strlen(my_string);
for (int i = 0; i < len; i++) {
// 只计算一次
}
必须保证字符串以 \0
strlen 的前提是它操作的字符串必须是一个合法的 C 风格字符串,即必须包含结尾的 \0,如果传入一个没有 \0 的字符数组,strlen 会继续向后读取内存,直到它偶然在内存中找到一个值为 0 的字节,这会导致未定义行为,通常表现为程序崩溃(段错误)或返回一个完全错误且巨大的长度。
char str_no_null[5] = {'H', 'e', 'l', 'l', 'o'}; // 没有 \0
// 下面这行代码是危险的!
size_t len = strlen(str_no_null); // 可能会崩溃或返回一个很大的随机数
sizeof vs strlen
初学者经常混淆 sizeof 和 strlen,这是一个非常重要的区别。
特性
sizeof
strlen
作用
计算变量或类型在内存中占用的总字节数。
计算字符串中(直到 \0 之前)的字符个数。
参数
可以是类型名(如 sizeof(int))或变量/数组名(sizeof my_array)。
必须是一个指向字符串的指针(char *)。
包含 \0 吗?
是,对于字符数组,sizeof 会把 \0 计算在内。
否,strlen 遇到 \0 就停止,不计算它。
示例
char str[] = "Hi";
sizeof(str); // 返回 3 ('H', 'i', '\0')
char str[] = "Hi";
strlen(str); // 返回 2 ('H', 'i')
与 strlen 相关的常用函数
在 <string.h> 中,还有其他一些相关的函数,了解它们可以帮助你更好地理解 strlen:
strcpy(dest, src): 字符串拷贝,它会将 src 字符串(包括 \0)复制到 dest 指向的内存区域。
strcat(dest, src): 字符串连接,它会将 src 字符串连接到 dest 字符串的末尾。
strcmp(s1, s2): 字符串比较,它会按字典顺序比较两个字符串。
strlen 是 C 语言中处理字符串时最基本、最常用的函数之一,它的核心功能是计算字符串的长度,但关键在于:
- 功能:计算字符串长度(字符数)。
- 原理:从字符串开头逐个字符查找,直到遇到
\0。
- 返回值:一个无符号整数
size_t,表示字符个数。
- 前提:传入的必须是一个合法的、以
\0 结尾的字符串。
- 区别:它和
sizeof 完全不同,sizeof 计算的是内存总大小。
strlen 的前提是它操作的字符串必须是一个合法的 C 风格字符串,即必须包含结尾的 \0,如果传入一个没有 \0 的字符数组,strlen 会继续向后读取内存,直到它偶然在内存中找到一个值为 0 的字节,这会导致未定义行为,通常表现为程序崩溃(段错误)或返回一个完全错误且巨大的长度。
char str_no_null[5] = {'H', 'e', 'l', 'l', 'o'}; // 没有 \0
// 下面这行代码是危险的!
size_t len = strlen(str_no_null); // 可能会崩溃或返回一个很大的随机数
sizeof vs strlen
初学者经常混淆 sizeof 和 strlen,这是一个非常重要的区别。
| 特性 | sizeof |
strlen |
|---|---|---|
| 作用 | 计算变量或类型在内存中占用的总字节数。 | 计算字符串中(直到 \0 之前)的字符个数。 |
| 参数 | 可以是类型名(如 sizeof(int))或变量/数组名(sizeof my_array)。 |
必须是一个指向字符串的指针(char *)。 |
包含 \0 吗? |
是,对于字符数组,sizeof 会把 \0 计算在内。 |
否,strlen 遇到 \0 就停止,不计算它。 |
| 示例 | char str[] = "Hi";sizeof(str); // 返回 3 ('H', 'i', '\0') |
char str[] = "Hi";strlen(str); // 返回 2 ('H', 'i') |
与 strlen 相关的常用函数
在 <string.h> 中,还有其他一些相关的函数,了解它们可以帮助你更好地理解 strlen:
strcpy(dest, src): 字符串拷贝,它会将src字符串(包括\0)复制到dest指向的内存区域。strcat(dest, src): 字符串连接,它会将src字符串连接到dest字符串的末尾。strcmp(s1, s2): 字符串比较,它会按字典顺序比较两个字符串。
strlen 是 C 语言中处理字符串时最基本、最常用的函数之一,它的核心功能是计算字符串的长度,但关键在于:
- 功能:计算字符串长度(字符数)。
- 原理:从字符串开头逐个字符查找,直到遇到
\0。 - 返回值:一个无符号整数
size_t,表示字符个数。 - 前提:传入的必须是一个合法的、以
\0结尾的字符串。 - 区别:它和
sizeof完全不同,sizeof计算的是内存总大小。
