C语言字符串数组长度函数是哪个?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 C语言 正文

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

c语言字符串数组的长度的函数是
(图片来源网络,侵删)

我们需要先澄清两个非常重要的概念,因为它们的处理方式完全不同:

  1. 以空字符结尾的字符数组(即C风格字符串)
  2. 字符串数组(即字符指针的数组或二维字符数组)

下面我将分别解释如何处理这两种情况。


获取单个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语言中,这通常有两种实现方式:

c语言字符串数组的长度的函数是
(图片来源网络,侵删)
  1. 字符指针数组: char *arr[]
  2. 二维字符数组: 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 循环直到 NULL 手动循环 最推荐,尤其适用于函数参数,灵活且安全

核心要点

  • 问单个字符串多长?用 strlen()
  • 问一个字符串数组(在代码里定义的)有多少个元素?用 sizeof()
  • 问一个传递给函数的字符串数组有多少个元素?约定用 NULL,然后循环计数。
-- 展开阅读全文 --
头像
织梦管理员默认密码忘记
« 上一篇 01-08
织梦后台自定义表单修改
下一篇 » 01-08

相关文章

取消
微信二维码
支付宝二维码