使用 strlen 函数(推荐)
strlen 是 C 标准库 <string.h> 中提供的函数,用于计算字符串的长度(不包括终止符 '\0')。
示例代码
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
size_t length = strlen(str); // 返回字符串长度
printf("字符串长度: %zu\n", length); // %zu 用于 size_t 类型
return 0;
}
输出:
字符串长度: 13
注意事项
strlen会遍历字符串直到遇到'\0',因此如果字符串未正确终止(如char str[] = {'H', 'e', 'l', 'l', 'o'}),会导致未定义行为(UB)。- 时间复杂度是 O(n),因为它需要遍历整个字符串。
手动计算字符串长度
如果不使用 strlen,可以自己遍历字符串计算长度:
示例代码
#include <stdio.h>
size_t custom_strlen(const char *str) {
size_t len = 0;
while (str[len] != '\0') { // 遍历直到遇到 '\0'
len++;
}
return len;
}
int main() {
char str[] = "Hello, World!";
size_t length = custom_strlen(str);
printf("字符串长度: %zu\n", length);
return 0;
}
输出:
字符串长度: 13
注意事项
- 和
strlen一样,必须确保字符串以'\0'- 这种方法适用于理解字符串遍历原理,但实际开发中建议直接使用
strlen。 - 这种方法适用于理解字符串遍历原理,但实际开发中建议直接使用
使用 sizeof 计算数组长度(仅适用于字符数组)
sizeof 可以计算数组的总字节数,但要注意:
- 仅适用于字符数组,不适用于指针(如
char *str = "Hello")。 - 会包含
'\0',所以长度比strlen多 1。
示例代码
#include <stdio.h>
int main() {
char str[] = "Hello, World!"; // 字符数组
size_t length = sizeof(str) - 1; // 减去 '\0' 的长度
printf("字符串长度: %zu\n", length);
return 0;
}
输出:
字符串长度: 13
注意事项
str是指针(如char *str = "Hello"),sizeof(str)返回的是指针大小(通常是 4 或 8 字节),而不是字符串长度。- 适用于静态定义的字符数组,不适用于动态分配的内存。
使用 wcslen 处理宽字符字符串
如果处理的是 wchar_t 类型的宽字符串(如 Unicode),应使用 wcslen(来自 <wchar.h>)。
示例代码
#include <stdio.h>
#include <wchar.h>
#include <locale.h> // 设置本地化环境
int main() {
setlocale(LC_ALL, ""); // 支持宽字符输出
wchar_t wstr[] = L"你好,世界!"; // 宽字符字符串
size_t length = wcslen(wstr);
printf("宽字符串长度: %zu\n", length);
return 0;
}
输出(可能因系统编码不同而变化):
宽字符串长度: 6
| 方法 | 适用场景 | 是否包含 '\0' |
备注 |
|---|---|---|---|
strlen |
最常用,适用于以 '\0' 结尾的字符串 |
❌ 不包含 | 标准库函数,推荐使用 |
| 手动遍历 | 学习或特殊需求 | ❌ 不包含 | 功能等同于 strlen |
sizeof |
仅适用于静态字符数组 | ✅ 包含 | 需手动减 1 |
wcslen |
宽字符字符串(如 Unicode) | ❌ 不包含 | 需要 <wchar.h> |
推荐做法:
- 优先使用
strlen,因为它简洁、高效且标准。 - 如果字符串可能未正确终止(如从网络或文件读取),应先检查
'\0'或使用安全的字符串函数(如strnlen)。
