在C语言中,没有一个内置的函数可以直接获取字符串数组的长度,因为C语言本身没有“字符串数组”这个原生类型。

(图片来源网络,侵删)
我们需要先澄清两个非常重要的概念,因为它们的处理方式完全不同:
- 以空字符结尾的字符数组(即C风格字符串)
- 字符串数组(即字符指针的数组或二维字符数组)
下面我将分别解释如何处理这两种情况。
获取单个C风格字符串的长度
这是最常见的情况,一个C风格的字符串是一个字符数组,其最后一个字符是空字符 '\0',要获取它的长度(即 '\0' 之前字符的个数),你需要使用标准库函数 strlen()。
函数:strlen()
- 头文件:
<string.h> - 函数原型:
size_t strlen(const char *str); - 功能: 计算字符串
str的长度,直到遇到第一个空字符'\0'为止。 - 返回值: 返回字符串的字符个数(不包括
'\0')。 - 注意:
strlen()会一直向后查找,直到找到'\0',如果字符串没有正确地以'\0'它会导致缓冲区溢出,可能会访问到非法内存,引发程序崩溃或不可预期的行为。
示例代码:
#include <stdio.h>
#include <string.h> // 必须包含此头文件
int main() {
char str1[] = "Hello"; // 编译器会自动在末尾添加 '\0'
char str2[50] = "World"; // 剩余空间被初始化为 '\0'
char str3[] = {'C', ' ', 'P', 'r', 'o', 'g', 'r', 'a', 'm', '\0'}; // 手动添加 '\0'
// 使用 strlen 获取长度
size_t len1 = strlen(str1);
size_t len2 = strlen(str2);
size_t len3 = strlen(str3);
printf("The length of \"%s\" is %zu\n", str1, len1); // 输出: The length of "Hello" is 5
printf("The length of \"%s\" is %zu\n", str2, len2); // 输出: The length of "World" is 5
printf("The length of \"%s\" is %zu\n", str3, len3); // 输出: The length of "C Program" is 9
// 错误示例:没有以 '\0'
char str4[] = {'a', 'b', 'c'};
// size_t len4 = strlen(str4); // 这是危险的!结果不可预测。
// printf("The length of str4 is %zu\n", len4); // 可能会输出一个很大的数
return 0;
}
获取字符串数组的长度
“字符串数组”通常指一个数组的每个元素都是一个字符串,在C语言中,这通常有两种实现方式:

(图片来源网络,侵删)
- 字符指针数组:
char *arr[] - 二维字符数组:
char arr[][N]
这两种方式的长度计算方法不同。
方法1:使用 sizeof 运算符(仅适用于在同一作用域内定义的数组)
sizeof 运算符可以计算出整个数组占用的字节数,如果数组元素的大小是固定的,我们就可以通过除法得到元素个数。
重要限制: sizeof 只能用于它所定义的那个数组,如果数组被传递给一个函数,在函数内部 sizeof 会退化为指针的大小,从而失效。
示例:字符指针数组
#include <stdio.h>
int main() {
// 字符串数组(字符指针数组)
char *fruits[] = {
"apple",
"banana",
"orange",
"grape"
};
// 计算数组的长度
// sizeof(fruits) 是整个指针数组的大小
// sizeof(fruits[0]) 是第一个指针的大小 (通常为 8 字节在64位系统)
int num_strings = sizeof(fruits) / sizeof(fruits[0]);
printf("The number of strings in the array is: %d\n", num_strings); // 输出: 4
return 0;
}
示例:二维字符数组
#include <stdio.h>
int main() {
// 字符串数组(二维字符数组)
// 注意:每个字符串的长度不能超过 N-1,因为要留一个位置给 '\0'
char animals[][10] = {
"Lion",
"Tiger",
"Bear",
"Wolf"
};
// 计算数组的行数(即字符串的个数)
// sizeof(animals) 是整个二维数组的大小
// sizeof(animals[0]) 是第一行的大小 (10 * sizeof(char))
int num_strings = sizeof(animals) / sizeof(animals[0]);
printf("The number of strings in the array is: %d\n", num_strings); // 输出: 4
return 0;
}
方法2:使用循环和 NULL 终止(推荐,更灵活)
这是C语言中处理字符串数组最经典和最安全的方法,尤其是在将数组作为参数传递给函数时,约定字符串数组的最后一个元素是一个 NULL 指针。
示例:
#include <stdio.h>
// 函数接收一个字符串指针数组
void print_strings(char *str_array[]) {
int count = 0;
// 循环直到遇到 NULL 指针
while (str_array[count] != NULL) {
printf("String %d: \"%s\"\n", count + 1, str_array[count]);
count++;
}
printf("Total number of strings: %d\n", count);
}
int main() {
char *languages[] = {
"C",
"C++",
"Java",
"Python",
NULL // 必须手动添加 NULL 作为结束标记
};
// 调用函数,可以正确计算长度
print_strings(languages);
return 0;
}
| 场景 | 数据结构 | 方法 | 函数/运算符 | 注意事项 |
|---|---|---|---|---|
| 获取单个字符串长度 | char str[] |
遍历直到 '\0' |
strlen() |
必须确保字符串以 '\0'
|
| 获取字符串数组长度 | char *arr[] |
计算元素个数 | sizeof() |
仅适用于定义它的作用域内,不能用于函数参数 |
| 获取字符串数组长度 | char arr[][N] |
计算行数 | sizeof() |
同上,且N必须固定 |
| 获取字符串数组长度 | char *arr[] (以NULL
|
核心要点:
- 问单个字符串多长?用
strlen()。 - 问一个字符串数组(在代码里定义的)有多少个元素?用
sizeof()。 - 问一个传递给函数的字符串数组有多少个元素?约定用
NULL,然后循环计数。
