c语言strlen什么意思

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

strlen 是 C 语言标准库中的一个函数,用于计算一个以空字符(\0)结尾的字符串的长度,这个长度是从字符串开头到第一个空字符之间的字符个数,并且不包含空字符本身

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

详细解释

strlen 的含义

  • str: 是 "string"(字符串)的缩写。
  • len: 是 "length"(长度)的缩写。
  • 合在一起,strlen 的意思就是 "string length"(字符串长度)。

函数原型

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

size_t strlen(const char *str);

让我们来分解这个原型:

  • size_t strlen(...):

    • size_t 是一个无符号的整数类型,通常用于表示大小、长度或索引,使用 size_t 而不是 int 是为了能表示内存中可能的最大对象大小,避免了负数,也更通用。
    • 这意味着 strlen 的返回值永远不可能是负数。
  • *`const char str`**:

    c语言strlen什么意思
    (图片来源网络,侵删)
    • char *str 表示 strlen 接收一个指向 char 类型的指针,在 C 语言中,字符串通常被表示为指向其第一个字符的指针。
    • const 关键字表示这个指针指向的字符串内容不会被 strlen 修改,这是一个很好的编程实践,它表明 strlen 是一个“只读”函数。

strlen 的工作原理

strlen 的工作方式非常简单直观:它从传入的地址(字符串的起始位置)开始,逐个字符地检查,直到它遇到一个值为 0 的字符,这个字符就是空字符(\0,也就是字符串的结束标志。

它会返回已经检查过的字符的数量。

重要提示:strlen 必须遍历整个字符串才能得到长度。 如果一个字符串很长,这个操作就会比较耗时,在一个循环中反复调用 strlen 来获取同一个字符串的长度是一个常见的性能陷阱。

代码示例

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

c语言strlen什么意思
(图片来源网络,侵删)
#include <stdio.h>
#include <string.h> // 必须包含这个头文件才能使用 strlen
int main() {
    // 定义一个字符串
    // C语言会在 "Hello" 后面自动添加一个 '\0' 作为结束符
    char greeting[] = "Hello";
    // 调用 strlen 计算字符串长度
    size_t length = strlen(greeting);
    // 打印结果
    printf("字符串是: \"%s\"\n", greeting);
    printf("字符串的长度是: %zu\n", length); // 注意使用 %zu 来打印 size_t 类型
    // 另一个例子
    char long_string[] = "This is a much longer string.";
    size_t long_length = strlen(long_string);
    printf("字符串 \"%s\" 的长度是: %zu\n", long_string, long_length);
    return 0;
}

输出结果:

字符串是: "Hello"
字符串的长度是: 5
字符串 "This is a much longer string." 的长度是: 26

常见误区和注意事项

  1. strlen 不计算 \0 这是最常见的误区。strlen 返回的是字符个数,而不是字节数,对于 "Hello",它有 5 个字符 H, e, l, l, o,长度就是 5,结尾的 \0 不计入长度。

  2. strlen 必须以 \0 strlen 遇到的不是一个合法的 C 字符串(即一个没有 \0 结尾的字符数组),它会继续向后读取内存中的内容,直到偶然找到一个值为 0 的字节,这会导致:

    • 返回一个完全错误的、非常大的长度。
    • 程序崩溃(访问到受保护的内存区域)。

    错误示例:

    char not_a_string[5] = {'H', 'e', 'l', 'l', 'o'}; // 没有结尾的 '\0'
    size_t len = strlen(not_a_string); // 行为未定义!可能出错或崩溃
  3. 性能陷阱:在循环中重复调用 看看下面的低效代码:

    // 低效的写法
    for (int i = 0; i < strlen(my_string); i++) {
        // do something with my_string[i]
    }

    在这个 for 循环中,每次迭代都会调用 strlen(my_string)my_string 很长,这将导致程序进行大量不必要的重复计算。

    高效的写法: 应该只在循环开始前调用一次,并将结果存储在一个变量中。

    // 高效的写法
    size_t len = strlen(my_string);
    for (size_t i = 0; i < len; i++) {
        // do something with my_string[i]
    }
  4. 返回类型是 size_t 因为 size_t 是无符号的,所以你不能将它与有符号整数(如 int)进行比较,否则可能会出现警告或意想不到的行为。

    // 潜在问题
    if (strlen(str) - 2 < 0) { // 这个判断可能永远为 false
        // ...
    }

strlensizeof 的区别

初学者经常混淆 strlensizeof,它们有本质的区别:

特性 strlen() sizeof
作用 计算运行时字符串的长度 计算类型或变量在内存中占用的字节大小
时间 运行时计算 编译时计算(对于静态数组)
参数 只接受 char *(字符串指针) 可以接受类型名或变量名
从头到 \0 的字符个数,不包含 \0 数组分配的总字节数,包含结尾的 \0(如果是字符数组)
示例 char s[] = "Hi";
strlen(s); // 返回 2
char s[] = "Hi";
sizeof(s); // 返回 3 (H, i, \0)

示例对比:

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "Hello"; // str 是一个字符数组,编译器分配了 6 个字节的空间
    printf("strlen(str) = %zu\n", strlen(str));   // 输出 5 (计算到 '\0' 前的字符数)
    printf("sizeof(str)  = %zu\n", sizeof(str));  // 输出 6 (计算整个数组占用的字节数)
    // str 是一个指针,sizeof 的结果就完全不同了
    char *ptr = "Hello";
    printf("strlen(ptr) = %zu\n", strlen(ptr));   // 输出 5
    printf("sizeof(ptr)  = %zu\n", sizeof(ptr));  // 输出 4 或 8 (取决于系统是 32 位还是 64 位,它只计算指针本身的大小)
    return 0;
}
  • strlen 是一个运行时函数,用于计算以 \0 结尾的字符串的长度
  • 它会扫描内存直到找到 \0
  • 必须包含 <string.h> 头文件。
  • 返回值是 size_t 类型(无符号)。
  • sizeof 不同,sizeof 是一个编译时操作符,用于计算类型或变量的内存大小
-- 展开阅读全文 --
头像
C语言中switch语句究竟该怎么用?
« 上一篇 03-13
织梦如何调用文章内容?
下一篇 » 03-13

相关文章

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