在C语言中,字符串(以 \0 结尾的字符数组)的长度可以通过多种方式获取,核心思想是:字符串的长度是指从字符串开头到第一个 \0(空字符)之间的字符个数,不包括 \0 本身。

(图片来源网络,侵删)
下面介绍几种常用方法,从最基础到最推荐。
使用标准库函数 strlen() (最推荐)
这是最常用、最简单、最安全的方法。strlen() 是 C 标准库 <string.h> 中提供的函数,专门用于计算字符串长度。
函数原型
size_t strlen(const char *str);
- 参数:
str是指向以\0结尾的字符串的指针。 - 返回值:返回字符串的长度,类型为
size_t(通常是unsigned int或unsigned long)。 - 注意:
strlen()会一直向后查找,直到遇到\0为止,如果字符串没有正确地以\0它会导致缓冲区溢出,访问到内存中不属于该字符串的区域,从而引发未定义行为(程序崩溃或得到错误结果)。
示例代码
#include <stdio.h>
#include <string.h> // 必须包含此头文件
int main() {
char my_string[] = "Hello, C Language!";
// 使用 strlen() 获取字符串长度
size_t length = strlen(my_string);
printf("字符串是: \"%s\"\n", my_string);
printf("字符串的长度是: %zu\n", length); // 使用 %zu 来打印 size_t 类型
return 0;
}
输出:
字符串是: "Hello, C Language!"
字符串的长度是: 16
手动实现一个长度计算函数
为了更好地理解 strlen() 的工作原理,你可以自己动手写一个,核心思想是使用一个循环指针,逐个字符移动,直到遇到 \0。

(图片来源网络,侵删)
实现思路
- 创建一个指针指向字符串的开头。
- 在循环中,检查当前指针指向的字符是否为
\0。 - 如果不是
\0,则增加长度计数器,并将指针移动到下一个字符。 - 如果是
\0,则循环结束,返回计数器的值。
示例代码
#include <stdio.h>
// 自定义的字符串长度计算函数
size_t my_strlen(const char *str) {
size_t length = 0;
// 循环直到遇到字符串的结尾符 '\0'
while (*str != '\0') {
length++;
str++; // 指针移动到下一个字符
}
return length;
}
int main() {
char my_string[] = "Manual Calculation";
// 使用自定义的 my_strlen() 函数
size_t length = my_strlen(my_string);
printf("字符串是: \"%s\"\n", my_string);
printf("字符串的长度是: %zu\n", length);
return 0;
}
输出:
字符串是: "Manual Calculation"
字符串的长度是: 18
这个实现和标准库 strlen() 的逻辑基本一致。
使用 sizeof 运算符 (重要!此方法有陷阱)
sizeof 是一个运算符,而不是函数,它返回一个变量或类型在内存中所占的字节数。
关键区别
sizeof计算的是整个数组的大小。strlen计算的是字符串中有效字符的数量。
何时 sizeof 可以“代替” strlen?
只有在你计算定义在栈上的、未被指针指向的字符数组的长度时,sizeof 才能给出数组的总容量,但这通常不是你想要的字符串长度。

(图片来源网络,侵删)
示例代码 (展示陷阱)
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello"; // str1 是一个字符数组
char *str2 = "World"; // str2 是一个指向字符串字面量的指针
// 情况一:对字符数组使用 sizeof
// sizeof(str1) 会计算整个数组的大小,包括结尾的 '\0'
// "Hello" 有 5 个字符 + 1 个 '\0' = 6 字节
printf("sizeof(str1) = %zu\n", sizeof(str1)); // 输出 6
// 情况二:对指针使用 sizeof
// sizeof(str2) 计算的是指针变量本身的大小,而不是它指向的字符串的长度
// 在 64 位系统上,指针通常是 8 字节
printf("sizeof(str2) = %zu\n", sizeof(str2)); // 输出 8 (在64位系统上)
// 正确的用法:用 strlen 获取字符串长度
printf("strlen(str1) = %zu\n", strlen(str1)); // 输出 5
printf("strlen(str2) = %zu\n", strlen(str2)); // 输出 5
// 数组作为函数参数时,会退化为指针
void func(char arr[]) {
// 在函数内部,arr 退化为指向数组首元素的指针
// sizeof(arr) 得到的是指针的大小,而不是数组的大小
printf("In function, sizeof(arr) = %zu\n", sizeof(arr)); // 输出 8 (在64位系统上)
}
func(str1);
return 0;
}
输出 (在 64 位系统上):
sizeof(str1) = 6
sizeof(str2) = 8
strlen(str1) = 5
strlen(str2) = 5
In function, sizeof(arr) = 8
除非你有特殊需求(如获取数组总容量),否则永远不要用 sizeof 来计算字符串的长度。 计算字符串长度请始终使用 strlen()。
总结与最佳实践
| 方法 | 描述 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
strlen() |
C标准库函数,计算到 \0 为止的字符数。 |
简单、标准、高效。 | 必须确保字符串以 \0 否则越界。 |
绝大多数情况下的首选。 |
| 手动循环 | 自己写循环遍历字符串直到 \0。 |
有助于理解底层原理,不依赖库。 | 代码冗长,容易出错,效率可能低于库函数。 | 学习目的,或在无法使用标准库的受限环境中。 |
sizeof() |
计算类型或变量占用的内存字节数。 | 计算数组总容量时非常快速。 | 极易混淆,对指针和函数参数会失效,得到的是错误结果。 | 仅用于计算静态定义的数组的总大小,绝不用于计算字符串长度。 |
核心要点:
- 字符串长度指的是有效字符的数量,不包括结尾的
\0。 strlen()是计算字符串长度的标准函数,应该作为你的首选。sizeof()是计算内存大小的运算符,不要用它来求字符串长度,这是一个非常常见的初学者错误。- 始终确保你的字符串正确地以
\0这是安全使用strlen()的前提。
