strlen在C语言中究竟是什么意思?

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

一句话概括

strlen 是 C 语言标准库中的一个函数,用于计算一个以空字符(\0)结尾的字符串的长度它返回的是字符串中字符的数量,但不包括结尾的空字符 \0

c语言中strlen是什么意思
(图片来源网络,侵删)

详细解释

它是什么?

strlen 是 "string length"(字符串长度)的缩写,它是一个标准库函数,定义在头文件 <string.h> 中,在你的 C 程序中使用 strlen 之前,必须包含这个头文件。

#include <string.h> // 必须包含这个头文件

函数原型

strlen 的函数原型通常是这样的:

size_t strlen(const char *str);

我们来分解一下这个原型:

  • size_t: 这是返回值的类型。size_t 是一个无符号整数类型,专门用于表示大小、长度或索引,它通常是 unsigned intunsigned long,使用无符号类型意味着返回的长度不可能是负数。
  • strlen: 函数名。
  • const char *str: 这是函数的参数。
    • char *: 表示一个指向字符的指针,在 C 语言中,字符串通常被表示为一个指向其第一个字符的指针。
    • const: 这是一个关键字,表示 str 指向的字符串内容在 strlen 函数内部不会被修改,这是一种安全承诺,告诉调用者这个函数只会读取字符串,而不会改变它。

它是如何工作的?

strlen 的工作原理非常直观:

c语言中strlen是什么意思
(图片来源网络,侵删)
  1. 它接收一个字符串指针(通常是字符数组名)。
  2. 它从该指针指向的内存地址开始,逐个字节地检查字符。
  3. 它会一直计数,直到它遇到一个空字符 \0(ASCII 码为 0)。
  4. 它停止计数,并返回已经计数的字符个数。

重要提示: strlen 不会计算结尾的 \0,它只是通过 \0 来判断字符串的结束位置。

使用示例

下面是一个简单的例子,展示了如何使用 strlen

#include <stdio.h>
#include <string.h> // 包含 strlen 函数的头文件
int main() {
    // 定义一个字符数组(字符串)
    char str1[] = "Hello, World!";
    // 定义一个指针指向字符串字面量
    const char *str2 = "C Programming";
    // 使用 strlen 计算字符串长度
    size_t len1 = strlen(str1);
    size_t len2 = strlen(str2);
    // 打印结果
    printf("字符串 \"%s\" 的长度是: %zu\n", str1, len1); // 输出 13
    printf("字符串 \"%s\" 的长度是: %zu\n", str2, len2); // 输出 14
    return 0;
}

内存中的样子(以 str1 为例):

内存地址 存储的字符 说明
&str1[0] 'H' 字符串开始
&str1[1] 'e'
&str1[2] 'l'
&str1[3] 'l'
&str1[4] 'o'
&str1[5] ','
&str1[6] ' '
&str1[7] 'W'
&str1[8] 'o'
&str1[9] 'r'
&str1[10] 'l'
&str1[11] 'd'
&str1[12] '!'
&str1[13] \0 字符串结束符

strlen&str1[0] 开始计数,数到 &str1[12] 的 '!',然后在 &str1[13] 遇到了 \0,于是停止,它数了 13 个字符,所以返回 13。


重要注意事项

性能:O(n) 时间复杂度

strlen 必须遍历整个字符串才能找到结尾的 \0,它的执行时间与字符串的长度成正比,如果一个字符串很长,strlen 就会比较慢,在性能敏感的代码中,如果多次使用同一个字符串的长度,最好先将结果存储在一个变量中,而不是反复调用 strlen

// 低效的做法
for (int i = 0; i < strlen(my_string); i++) {
    // 每次循环都会重新计算 strlen
}
// 高效的做法
size_t len = strlen(my_string);
for (int i = 0; i < len; i++) {
    // 只计算一次
}

必须保证字符串以 \0

strlen 的前提是它操作的字符串必须是一个合法的 C 风格字符串,即必须包含结尾的 \0,如果传入一个没有 \0 的字符数组,strlen 会继续向后读取内存,直到它偶然在内存中找到一个值为 0 的字节,这会导致未定义行为,通常表现为程序崩溃(段错误)或返回一个完全错误且巨大的长度。

char str_no_null[5] = {'H', 'e', 'l', 'l', 'o'}; // 没有 \0 
// 下面这行代码是危险的!
size_t len = strlen(str_no_null); // 可能会崩溃或返回一个很大的随机数

sizeof vs strlen

初学者经常混淆 sizeofstrlen,这是一个非常重要的区别。

特性 sizeof strlen
作用 计算变量或类型在内存中占用的总字节数 计算字符串中(直到 \0 之前)的字符个数
参数 可以是类型名(如 sizeof(int))或变量/数组名(sizeof my_array)。 必须是一个指向字符串的指针(char *)。
包含 \0 吗? ,对于字符数组,sizeof 会把 \0 计算在内。 strlen 遇到 \0 就停止,不计算它。
示例 char str[] = "Hi";
sizeof(str); // 返回 3 ('H', 'i', '\0')
char str[] = "Hi";
strlen(str); // 返回 2 ('H', 'i')

strlen 相关的常用函数

<string.h> 中,还有其他一些相关的函数,了解它们可以帮助你更好地理解 strlen

  • strcpy(dest, src): 字符串拷贝,它会将 src 字符串(包括 \0)复制到 dest 指向的内存区域。
  • strcat(dest, src): 字符串连接,它会将 src 字符串连接到 dest 字符串的末尾。
  • strcmp(s1, s2): 字符串比较,它会按字典顺序比较两个字符串。

strlen 是 C 语言中处理字符串时最基本、最常用的函数之一,它的核心功能是计算字符串的长度,但关键在于:

  1. 功能:计算字符串长度(字符数)。
  2. 原理:从字符串开头逐个字符查找,直到遇到 \0
  3. 返回值:一个无符号整数 size_t,表示字符个数。
  4. 前提:传入的必须是一个合法的、以 \0 结尾的字符串。
  5. 区别:它和 sizeof 完全不同,sizeof 计算的是内存总大小。

-- 展开阅读全文 --
头像
织梦2025漏洞关键词有哪些?
« 上一篇 01-21
C语言结构化设计,核心优势是什么?
下一篇 » 01-21

相关文章

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