`
int len = strlen(s);` 是 C 语言中获取字符串长度的关键操作,
下面我将详细解释它的作用、原理和注意事项:
1. strlen()
函数基础
- 功能:计算字符串的长度(字符数),不包括结尾的
'\0'
(空字符) - 头文件:
#include <string.h>
- 原型:
size_t strlen(const char *str)
- 返回值:返回字符串的字符长度(
size_t
类型,通常用int
接收)
2. 代码中的具体行为
int len = strlen(s);
- 输入:字符串指针
s
(例如"Hello"
) - 输出:字符串长度赋值给
len
(例如"Hello"
的长度是 5) - 内存布局示例:
"Hello" 在内存中的表示: Index: 0 1 2 3 4 5 Value: 'H' 'e' 'l' 'l' 'o' '\0'
strlen(s)
会返回5
(遇到'\0'
停止计数)。
3. 底层实现原理
strlen()
的典型实现方式:
size_t strlen(const char *s) {
size_t len = 0;
while (*s != '\0') { // 遍历直到遇到空字符
len++;
s++;
}
return len;
}
- 时间复杂度:O(n)(需要遍历整个字符串)
- 关键点:依赖字符串必须以
'\0'
结尾(C 字符串的基本规则)。
4. 为什么需要先获取长度?
在你的代码中:
for (int i = 0; i < len; ++i)
- 作用:通过预先计算长度,避免在循环中重复调用
strlen(s)
,提高效率。 - 对比低效写法:
这种写法会导致for (int i = 0; i < strlen(s); ++i) // 每次循环都调用 strlen()
strlen()
被多次调用,时间复杂度升至 O(n²)。
5. 注意事项
-
字符串必须合法:
- 如果
s
不是以'\0'
结尾的字符数组,strlen()
会越界访问内存,导致未定义行为。 - 错误示例:
char s[3] = {'a', 'b', 'c'}; // 缺少 '\0' int len = strlen(s); // 危险!
- 如果
-
返回值类型:
strlen()
返回size_t
(无符号整型),直接赋给int
可能在极长字符串时丢失精度(但题目限制长度 ≤100,无需担心)。
-
性能优化:
- 对于已知长度的字符串(如固定大小的数组),可以避免调用
strlen()
。
- 对于已知长度的字符串(如固定大小的数组),可以避免调用
6. 替代方案
如果确定字符串以 '\0'
结尾,可以直接用循环遍历:
for (int i = 0; s[i] != '\0'; ++i) {
// 处理字符
}
这种写法省去了 strlen()
的调用,但可读性稍差。
总结
int len = strlen(s);
的作用是:
- 安全获取字符串长度(前提是字符串合法)。
- 避免循环中重复计算长度,提升性能。
- 明确循环边界,使代码意图更清晰。
在你的大小写转换函数中,这是一种高效且可靠的做法。