strlen 是什么?
strlen 是 C 语言标准库 <string.h> 中的一个函数,它的全称是 "string length"(字符串长度)。

(图片来源网络,侵删)
功能: 计算并返回以 '\0' (空字符) 结尾的字符串的长度,这个长度不包括结尾的空字符 '\0'。
函数原型
你可以在 C 语言的头文件 <string.h> 中找到它的声明:
size_t strlen(const char *str);
参数解析:
const char *str: 这是一个指向字符数组的指针,也就是你想要计算长度的字符串。char *: 表示它指向一个字符。const: 这是一个关键字,表示strlen函数不会修改你传入的字符串内容,这是一个很好的编程实践,确保函数的安全性。
- 返回值:
size_t: 返回一个size_t类型的值,表示字符串的长度。size_t是一个无符号整数类型(通常是unsigned int或unsigned long),专门用于表示大小、长度或索引,使用它可以表示更大的数值范围,并且能更好地处理内存相关的计算。- 如果传入的指针是
NULL(空指针),行为是未定义的,通常会导致程序崩溃(段错误)。
工作原理
strlen 的工作方式非常简单直观:
- 它接收一个指向字符串首字符的指针。
- 它从这个位置开始,逐个字符地检查内存中的内容。
- 它会一直计数,直到它遇到一个值为
0的字符,这个字符就是字符串的终止符'\0'。 - 它返回计数的数值,这个数值就是字符串的长度(不包括
'\0')。
内存示意图:
假设有一个字符串 "hello",它在内存中是这样存储的:
地址: 1000 1001 1002 1003 1004 1005 'h' 'e' 'l' 'l' 'o' '\0'
索引: 0 1 2 3 4
当调用 strlen("hello") 时:
- 指针指向地址 1000。
- 计数器从 0 开始。
- 检查地址 1000,是 'h',计数器变为 1。
- 检查地址 1001,是 'e',计数器变为 2。
- 检查地址 1002,是 'l',计数器变为 3。
- 检查地址 1003,是 'l',计数器变为 4。
- 检查地址 1004,是 'o',计数器变为 5。
- 检查地址 1005,是
'\0',循环结束。 - 函数返回计数器的值
5。
代码示例
下面是一个完整的 C 程序,演示了 strlen 的基本用法。
#include <stdio.h>
#include <string.h> // 必须包含这个头文件才能使用 strlen
int main() {
char str1[] = "Hello, World!";
char str2[] = "C Programming";
char str3[] = ""; // 空字符串
char str4[] = "A"; // 只有一个字符的字符串
// 计算 str1 的长度
size_t len1 = strlen(str1);
printf("The length of \"%s\" is: %zu\n", str1, len1);
// 计算 str2 的长度
size_t len2 = strlen(str2);
printf("The length of \"%s\" is: %zu\n", str2, len2);
// 计算空字符串的长度
size_t len3 = strlen(str3);
printf("The length of \"%s\" is: %zu\n", str3, len3);
// 计算单字符字符串的长度
size_t len4 = strlen(str4);
printf("The length of \"%s\" is: %zu\n", str4, len4);
// --- 重要警告:不要对 NULL 指针使用 strlen ---
// char *str_null = NULL;
// size_t len_null = strlen(str_null); // 这行代码会导致程序崩溃!
// printf("Length of NULL string: %zu\n", len_null);
return 0;
}
输出结果:
The length of "Hello, World!" is: 13
The length of "C Programming" is: 13
The length of "" is: 0
The length of "A" is: 1
重要注意事项和常见错误
-
必须包含
<string.h>头文件 如果你忘记#include <string.h>,编译器会报错,提示strlen未声明。 -
字符串必须以
'\0'strlen依赖'\0'来判断字符串的结束,如果你创建的字符数组没有'\0',strlen会继续向后读取内存,直到它偶然遇到一个值为 0 的字节,这可能导致:- 返回一个完全错误且巨大的长度。
- 访问到受保护的内存区域,导致程序崩溃(段错误)。
错误示例:
char str_no_null[5] = {'H', 'e', 'l', 'l', 'o'}; // 没有 '\0' printf("%zu\n", strlen(str_no_no_null)); // 危险!结果不可预测。 -
不要对
NULL指针使用strlen传入NULL会导致未定义行为,最常见的后果是程序崩溃(段错误),在调用strlen之前,最好检查指针是否为NULL。安全示例:
char *my_string = NULL; if (my_string != NULL) { printf("Length: %zu\n", strlen(my_string)); } else { printf("Error: String pointer is NULL.\n"); } -
性能考虑:
strlen是 O(n) 操作strlen必须遍历整个字符串才能找到结尾,在一个循环中频繁调用strlen来获取同一个字符串的长度是低效的,更好的做法是在循环外先计算长度并存储起来。低效示例:
for (int i = 0; i < strlen(my_string); i++) { // 每次循环都调用 strlen! // do something }高效示例:
size_t len = strlen(my_string); for (size_t i = 0; i < len; i++) { // do something }
手动实现 strlen
为了更好地理解 strlen 的工作原理,你可以自己动手实现一个。
#include <stdio.h>
// 我们自己的 strlen 实现
size_t my_strlen(const char *str) {
size_t length = 0;
// 循环,直到指针指向的字符是 '\0'
while (*str != '\0') {
length++; // 长度加一
str++; // 指针移动到下一个字符
}
return length;
}
int main() {
char text[] = "This is a test.";
printf("Using my_strlen: %zu\n", my_strlen(text));
printf("Using standard strlen: %zu\n", strlen(text));
return 0;
}
这个手动实现和标准库 strlen 的逻辑是完全一样的。
| 特性 | 描述 |
|---|---|
| 头文件 | <string.h> |
| 功能 | 计算字符串长度 |
| 参数 | const char * (指向字符串的常量指针) |
| 返回值 | size_t (字符串长度,不包括 '\0') |
| 依赖 | 字符串必须以 '\0'
|
| 性能 | 时间复杂度为 O(n) |
| 注意事项 | 不能对 NULL 指针使用,否则会崩溃 |
掌握 strlen 是学习 C 语言字符串处理的第一步,也是非常重要的一步。
