strlen函数如何计算字符串长度?

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

strlen 是什么?

strlen 是 C 语言标准库 <string.h> 中的一个函数,它的全称是 "string length"(字符串长度)。

c语言 strlen
(图片来源网络,侵删)

功能: 计算并返回以 '\0' (空字符) 结尾的字符串的长度,这个长度不包括结尾的空字符 '\0'

函数原型

你可以在 C 语言的头文件 <string.h> 中找到它的声明:

size_t strlen(const char *str);

参数解析:

  • const char *str: 这是一个指向字符数组的指针,也就是你想要计算长度的字符串。
    • char *: 表示它指向一个字符。
    • const: 这是一个关键字,表示 strlen 函数不会修改你传入的字符串内容,这是一个很好的编程实践,确保函数的安全性。
  • 返回值:
    • size_t: 返回一个 size_t 类型的值,表示字符串的长度。
    • size_t 是一个无符号整数类型(通常是 unsigned intunsigned long),专门用于表示大小、长度或索引,使用它可以表示更大的数值范围,并且能更好地处理内存相关的计算。
    • 如果传入的指针是 NULL(空指针),行为是未定义的,通常会导致程序崩溃(段错误)。

工作原理

strlen 的工作方式非常简单直观:

  1. 它接收一个指向字符串首字符的指针。
  2. 它从这个位置开始,逐个字符地检查内存中的内容。
  3. 它会一直计数,直到它遇到一个值为 0 的字符,这个字符就是字符串的终止符 '\0'
  4. 它返回计数的数值,这个数值就是字符串的长度(不包括 '\0')。

内存示意图:

假设有一个字符串 "hello",它在内存中是这样存储的:

地址:  1000  1001  1002  1003  1004  1005  'h'   'e'   'l'   'l'   'o'   '\0'
索引:   0     1     2     3     4

当调用 strlen("hello") 时:

  • 指针指向地址 1000。
  • 计数器从 0 开始。
  • 检查地址 1000,是 'h',计数器变为 1。
  • 检查地址 1001,是 'e',计数器变为 2。
  • 检查地址 1002,是 'l',计数器变为 3。
  • 检查地址 1003,是 'l',计数器变为 4。
  • 检查地址 1004,是 'o',计数器变为 5。
  • 检查地址 1005,是 '\0',循环结束。
  • 函数返回计数器的值 5

代码示例

下面是一个完整的 C 程序,演示了 strlen 的基本用法。

#include <stdio.h>
#include <string.h> // 必须包含这个头文件才能使用 strlen
int main() {
    char str1[] = "Hello, World!";
    char str2[] = "C Programming";
    char str3[] = ""; // 空字符串
    char str4[] = "A"; // 只有一个字符的字符串
    // 计算 str1 的长度
    size_t len1 = strlen(str1);
    printf("The length of \"%s\" is: %zu\n", str1, len1);
    // 计算 str2 的长度
    size_t len2 = strlen(str2);
    printf("The length of \"%s\" is: %zu\n", str2, len2);
    // 计算空字符串的长度
    size_t len3 = strlen(str3);
    printf("The length of \"%s\" is: %zu\n", str3, len3);
    // 计算单字符字符串的长度
    size_t len4 = strlen(str4);
    printf("The length of \"%s\" is: %zu\n", str4, len4);
    // --- 重要警告:不要对 NULL 指针使用 strlen ---
    // char *str_null = NULL;
    // size_t len_null = strlen(str_null); // 这行代码会导致程序崩溃!
    // printf("Length of NULL string: %zu\n", len_null);
    return 0;
}

输出结果:

The length of "Hello, World!" is: 13
The length of "C Programming" is: 13
The length of "" is: 0
The length of "A" is: 1

重要注意事项和常见错误

  1. 必须包含 <string.h> 头文件 如果你忘记 #include <string.h>,编译器会报错,提示 strlen 未声明。

  2. 字符串必须以 '\0' strlen 依赖 '\0' 来判断字符串的结束,如果你创建的字符数组没有 '\0'strlen 会继续向后读取内存,直到它偶然遇到一个值为 0 的字节,这可能导致:

    • 返回一个完全错误且巨大的长度。
    • 访问到受保护的内存区域,导致程序崩溃(段错误)。

    错误示例:

    char str_no_null[5] = {'H', 'e', 'l', 'l', 'o'}; // 没有 '\0'
    printf("%zu\n", strlen(str_no_no_null)); // 危险!结果不可预测。
  3. 不要对 NULL 指针使用 strlen 传入 NULL 会导致未定义行为,最常见的后果是程序崩溃(段错误),在调用 strlen 之前,最好检查指针是否为 NULL

    安全示例:

    char *my_string = NULL;
    if (my_string != NULL) {
        printf("Length: %zu\n", strlen(my_string));
    } else {
        printf("Error: String pointer is NULL.\n");
    }
  4. 性能考虑:strlen 是 O(n) 操作 strlen 必须遍历整个字符串才能找到结尾,在一个循环中频繁调用 strlen 来获取同一个字符串的长度是低效的,更好的做法是在循环外先计算长度并存储起来。

    低效示例:

    for (int i = 0; i < strlen(my_string); i++) { // 每次循环都调用 strlen!
        // do something
    }

    高效示例:

    size_t len = strlen(my_string);
    for (size_t i = 0; i < len; i++) {
        // do something
    }

手动实现 strlen

为了更好地理解 strlen 的工作原理,你可以自己动手实现一个。

#include <stdio.h>
// 我们自己的 strlen 实现
size_t my_strlen(const char *str) {
    size_t length = 0;
    // 循环,直到指针指向的字符是 '\0'
    while (*str != '\0') {
        length++; // 长度加一
        str++;    // 指针移动到下一个字符
    }
    return length;
}
int main() {
    char text[] = "This is a test.";
    printf("Using my_strlen: %zu\n", my_strlen(text));
    printf("Using standard strlen: %zu\n", strlen(text));
    return 0;
}

这个手动实现和标准库 strlen 的逻辑是完全一样的。

特性 描述
头文件 <string.h>
功能 计算字符串长度
参数 const char * (指向字符串的常量指针)
返回值 size_t (字符串长度,不包括 '\0')
依赖 字符串必须以 '\0'
性能 时间复杂度为 O(n)
注意事项 不能对 NULL 指针使用,否则会崩溃

掌握 strlen 是学习 C 语言字符串处理的第一步,也是非常重要的一步。

-- 展开阅读全文 --
头像
dede搜索功能如何实现?
« 上一篇 今天
dede保存文章为何会空白?
下一篇 » 今天
取消
微信二维码
支付宝二维码