strlen 是 C 语言标准库中的一个函数,用于计算一个以空字符(\0)结尾的字符串的长度,这个长度是从字符串开头到第一个空字符之间的字符个数,并且不包含空字符本身。

详细解释
strlen 的含义
str: 是 "string"(字符串)的缩写。len: 是 "length"(长度)的缩写。- 合在一起,
strlen的意思就是 "string length"(字符串长度)。
函数原型
你可以在 C 语言的头文件 <string.h> 中找到 strlen 的声明:
size_t strlen(const char *str);
让我们来分解这个原型:
-
size_t strlen(...):size_t是一个无符号的整数类型,通常用于表示大小、长度或索引,使用size_t而不是int是为了能表示内存中可能的最大对象大小,避免了负数,也更通用。- 这意味着
strlen的返回值永远不可能是负数。
-
*`const char str`**:
(图片来源网络,侵删)char *str表示strlen接收一个指向char类型的指针,在 C 语言中,字符串通常被表示为指向其第一个字符的指针。const关键字表示这个指针指向的字符串内容不会被strlen修改,这是一个很好的编程实践,它表明strlen是一个“只读”函数。
strlen 的工作原理
strlen 的工作方式非常简单直观:它从传入的地址(字符串的起始位置)开始,逐个字符地检查,直到它遇到一个值为 0 的字符,这个字符就是空字符(\0),也就是字符串的结束标志。
它会返回已经检查过的字符的数量。
重要提示:strlen 必须遍历整个字符串才能得到长度。 如果一个字符串很长,这个操作就会比较耗时,在一个循环中反复调用 strlen 来获取同一个字符串的长度是一个常见的性能陷阱。
代码示例
下面是一个简单的例子,展示了如何使用 strlen。

#include <stdio.h>
#include <string.h> // 必须包含这个头文件才能使用 strlen
int main() {
// 定义一个字符串
// C语言会在 "Hello" 后面自动添加一个 '\0' 作为结束符
char greeting[] = "Hello";
// 调用 strlen 计算字符串长度
size_t length = strlen(greeting);
// 打印结果
printf("字符串是: \"%s\"\n", greeting);
printf("字符串的长度是: %zu\n", length); // 注意使用 %zu 来打印 size_t 类型
// 另一个例子
char long_string[] = "This is a much longer string.";
size_t long_length = strlen(long_string);
printf("字符串 \"%s\" 的长度是: %zu\n", long_string, long_length);
return 0;
}
输出结果:
字符串是: "Hello"
字符串的长度是: 5
字符串 "This is a much longer string." 的长度是: 26
常见误区和注意事项
-
strlen不计算\0这是最常见的误区。strlen返回的是字符个数,而不是字节数,对于"Hello",它有 5 个字符H, e, l, l, o,长度就是 5,结尾的\0不计入长度。 -
strlen必须以\0strlen遇到的不是一个合法的 C 字符串(即一个没有\0结尾的字符数组),它会继续向后读取内存中的内容,直到偶然找到一个值为0的字节,这会导致:- 返回一个完全错误的、非常大的长度。
- 程序崩溃(访问到受保护的内存区域)。
错误示例:
char not_a_string[5] = {'H', 'e', 'l', 'l', 'o'}; // 没有结尾的 '\0' size_t len = strlen(not_a_string); // 行为未定义!可能出错或崩溃 -
性能陷阱:在循环中重复调用 看看下面的低效代码:
// 低效的写法 for (int i = 0; i < strlen(my_string); i++) { // do something with my_string[i] }在这个
for循环中,每次迭代都会调用strlen(my_string)。my_string很长,这将导致程序进行大量不必要的重复计算。高效的写法: 应该只在循环开始前调用一次,并将结果存储在一个变量中。
// 高效的写法 size_t len = strlen(my_string); for (size_t i = 0; i < len; i++) { // do something with my_string[i] } -
返回类型是
size_t因为size_t是无符号的,所以你不能将它与有符号整数(如int)进行比较,否则可能会出现警告或意想不到的行为。// 潜在问题 if (strlen(str) - 2 < 0) { // 这个判断可能永远为 false // ... }
strlen 与 sizeof 的区别
初学者经常混淆 strlen 和 sizeof,它们有本质的区别:
| 特性 | strlen() |
sizeof |
|---|---|---|
| 作用 | 计算运行时字符串的长度 | 计算类型或变量在内存中占用的字节大小 |
| 时间 | 运行时计算 | 编译时计算(对于静态数组) |
| 参数 | 只接受 char *(字符串指针) |
可以接受类型名或变量名 |
从头到 \0 的字符个数,不包含 \0 |
数组分配的总字节数,包含结尾的 \0(如果是字符数组) |
|
| 示例 | char s[] = "Hi";strlen(s); // 返回 2 |
char s[] = "Hi";sizeof(s); // 返回 3 (H, i, \0) |
示例对比:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello"; // str 是一个字符数组,编译器分配了 6 个字节的空间
printf("strlen(str) = %zu\n", strlen(str)); // 输出 5 (计算到 '\0' 前的字符数)
printf("sizeof(str) = %zu\n", sizeof(str)); // 输出 6 (计算整个数组占用的字节数)
// str 是一个指针,sizeof 的结果就完全不同了
char *ptr = "Hello";
printf("strlen(ptr) = %zu\n", strlen(ptr)); // 输出 5
printf("sizeof(ptr) = %zu\n", sizeof(ptr)); // 输出 4 或 8 (取决于系统是 32 位还是 64 位,它只计算指针本身的大小)
return 0;
}
strlen是一个运行时函数,用于计算以\0结尾的字符串的长度。- 它会扫描内存直到找到
\0。 - 必须包含
<string.h>头文件。 - 返回值是
size_t类型(无符号)。 - 与
sizeof不同,sizeof是一个编译时操作符,用于计算类型或变量的内存大小。
