C语言字符串数组长度函数是什么?

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

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

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

下面介绍几种常用方法,从最基础到最推荐。


使用标准库函数 strlen() (最推荐)

这是最常用、最简单、最安全的方法。strlen() 是 C 标准库 <string.h> 中提供的函数,专门用于计算字符串长度。

函数原型

size_t strlen(const char *str);
  • 参数str 是指向以 \0 结尾的字符串的指针。
  • 返回值:返回字符串的长度,类型为 size_t(通常是 unsigned intunsigned 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

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

实现思路

  1. 创建一个指针指向字符串的开头。
  2. 在循环中,检查当前指针指向的字符是否为 \0
  3. 如果不是 \0,则增加长度计数器,并将指针移动到下一个字符。
  4. 如果是 \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 才能给出数组的总容量,但这通常不是你想要的字符串长度。

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

示例代码 (展示陷阱)

#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() 计算类型或变量占用的内存字节数。 计算数组总容量时非常快速。 极易混淆,对指针和函数参数会失效,得到的是错误结果。 仅用于计算静态定义的数组的总大小绝不用于计算字符串长度

核心要点:

  1. 字符串长度指的是有效字符的数量,不包括结尾的 \0
  2. strlen() 是计算字符串长度的标准函数,应该作为你的首选。
  3. sizeof() 是计算内存大小的运算符,不要用它来求字符串长度,这是一个非常常见的初学者错误。
  4. 始终确保你的字符串正确地以 \0 这是安全使用 strlen() 的前提。
-- 展开阅读全文 --
头像
C语言基础理论与案例如何高效结合学习?
« 上一篇 今天
织梦5.7后台操作怎么学?
下一篇 » 今天

相关文章

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

目录[+]