在C语言中,字符串是以字符数组的形式存储的,并以空字符 '\0' 作为结束标志,要获取字符串(字符数组)的长度,可以使用以下几种方法:

(图片来源网络,侵删)
使用 strlen 函数(推荐)
strlen 是C标准库 <string.h> 中提供的函数,用于计算字符串的长度(不包括结尾的 '\0')。
语法
size_t strlen(const char *str);
- 参数:
str是指向字符串的指针。 - 返回值:返回字符串的长度(
size_t类型,通常是unsigned long)。
示例
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
size_t len = strlen(str);
printf("字符串长度: %zu\n", len); // 输出: 13
return 0;
}
注意事项
strlen会遍历字符串直到遇到'\0',因此如果字符串没有正确终止(即缺少'\0'),会导致未定义行为(如越界访问)。- 时间复杂度为 O(n)(需要遍历整个字符串)。
手动计算字符串长度
如果不使用 strlen,可以自己遍历字符数组,直到遇到 '\0'。
示例
#include <stdio.h>
size_t my_strlen(const char *str) {
size_t len = 0;
while (str[len] != '\0') {
len++;
}
return len;
}
int main() {
char str[] = "Hello, World!";
size_t len = my_strlen(str);
printf("字符串长度: %zu\n", len); // 输出: 13
return 0;
}
注意事项
- 和
strlen一样,如果字符串没有'\0',会导致越界访问。 - 适用于理解底层原理,但实际开发中建议直接使用
strlen。
使用 sizeof 计算字符数组总长度(仅适用于静态数组)
sizeof 返回的是整个数组的字节大小(包括 '\0'),而不是字符串的实际长度。仅适用于静态定义的字符数组,不适用于指针或动态分配的内存。
示例
#include <stdio.h>
int main() {
char str[] = "Hello"; // 隐含 '\0',实际占用 6 字节
size_t total_size = sizeof(str); // 输出 6
size_t str_len = strlen(str); // 输出 5
printf("数组总大小: %zu\n", total_size); // 6
printf("字符串长度: %zu\n", str_len); // 5
return 0;
}
注意事项
str是指针(如char *str = "Hello"),sizeof(str)返回的是指针的大小(通常是 4 或 8 字节),而不是字符串长度。- 不能用于动态分配的数组(如
malloc分配的内存)。
使用 wcslen 处理宽字符字符串(Unicode)
如果处理的是宽字符字符串(如 wchar_t),可以使用 <wchar.h> 中的 wcslen。

(图片来源网络,侵删)
示例
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, ""); // 设置本地化环境
wchar_t wstr[] = L"你好,世界!";
size_t len = wcslen(wstr);
printf("宽字符串长度: %zu\n", len); // 输出: 6
return 0;
}
| 方法 | 适用场景 | 是否包含 '\0' |
时间复杂度 |
|---|---|---|---|
strlen |
推荐方法,适用于所有字符串 | ❌ 不包含 | O(n) |
| 手动遍历 | 学习底层原理 | ❌ 不包含 | O(n) |
sizeof |
仅适用于静态字符数组 | ✅ 包含 | O(1) |
wcslen |
宽字符字符串(Unicode) | ❌ 不包含 | O(n) |
推荐使用 strlen,除非有特殊需求(如避免标准库调用)。

(图片来源网络,侵删)
