C strlen() 函数

C strlen() 语法

strlen() 是 C 语言 <string.h> 标准库的一个函数,它用于计算字符串的长度(不包括末尾的空字符 '\0')。

其中,strlen 是 “string length(字符串长度)” 的缩写。

语法:

strlen(str)

说明:

strlen() 函数接收单个参数。

  • str(const char*):是一个字符串的指针。

strlen() 返回一个 size_t 类型的值,表示字符串的长度。其中,size_t 是一种无符号整数类型,一般用于表示大小或长度。

对于 strlen() 函数来说,小伙伴们要清楚以下几点。

  • strlen() 只会计算字符串中实际字符的个数,但不包括末尾的空字符 '\0'。
  • sizeof 是一个运算符,用于计算变量或类型的内存大小。而 strlen() 是一个函数,只会计算字符串的字符长度。
  • 如果想要打印 size_t 类型的数据,应该使用打印格式符 “%zu”。

注意: 在使用 strlen() 时,我们必须要确保传入的字符串以空字符 '\0' 结尾,否则可能导致报错。

C strlen() 摘要

使用频率
修改字符串
官方文档 查看

C strlen() 示例

接下来,我们通过几个简单的例子来讲解一下 C strlen() 函数是如何使用的。

示例 1:strlen() 计算英文字符串的长度

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[] = "lvye";
    size_t length = strlen(str);
    printf("%zu", length);
    return 0;
}

运行结果如下。

4

分析:

strlen() 函数本质上就是计算整个字符串所占的字节数(不包括结束符 '\0')。如果是英文字符,每一个字符则占 1 个字节。

示例 2:strlen() 计算中文字符串的长度

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[] = "绿叶网";
    size_t length = strlen(str);
    printf("字节长度:%zu\n", length);
    return 0;
}

如果源文件是 UTF-8 编码,那么运行结果如下:

字节长度:9

如果源文件是 GBK 编码,那么运行结果如下:

字节长度:6

分析:

 在 UTF-8 编码中,一个汉字占用 3 个字节。所以 “绿叶网” 占 3 * 3 = 9 个字节。

 而在 GBK 编码中,一个汉字占用 2 个字节。所以 “绿叶网” 占 3 * 2 = 6 个字节。

注意: 不要直接用 strlen() 来统计汉字的个数(字数),除非你知道确切的编码格式(不过这一般也是不严谨的)。

示例 3:strlen() 计算空字符串的长度

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[] = "";
    size_t length = strlen(str);
    printf("%zu", length);
    return 0;
}

运行结果如下。

0

分析:

对于空字符串来说,它的长度为 0。

示例 4:空格也是一个字符

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[] = "hello lvye!";
    size_t length = strlen(str);
    printf("%zu", length);
    return 0;
}

运行结果如下。

11

分析:

咦,怎么回事呢?str 的长度不应该是 10 吗?怎么是 11 呢?其实空格本身也是作为一个字符来处理的,这一点小伙伴们不要忽略了。

示例 5: “定义的长度” 大于 “实际的长度”

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[100] = "python";
    size_t length = strlen(str);
    printf("%zu", length);
    return 0;
}

运行结果如下。

6

分析:

在这个例子中,我们定义了 str 的长度为 100,但 strlen() 函数只会统计字符串的有效长度(即看到的长度),这一点小伙伴们一定要记住。

示例 6:3 种创建字符串方式的长度

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str1[] = "lvye";
    char* str2 = "lvye";
    char str3[] = {'l', 'v', 'y', 'e', '\0'};

    printf("%zu\n", strlen(str1));
    printf("%zu\n", strlen(str2));
    printf("%zu", strlen(str3));
    return 0;
}

运行结果如下。

4
4
4

分析:

需要注意的是,str3 中的 '\0' 是不能省略的。如果省略 '\0',此时 str3 就不再是一个字符串,而是一个字符数组。

我们把 char str3[] = {'l', 'v', 'y', 'e', '\0'}; 改为 char str3[] = {'l', 'v', 'y', 'e'};,如果对它调用 strlen(str3),那么函数会从数组首地址开始,一直向后读取内存,直到碰巧在内存中遇到一个 0 值为止。

这样会导致 “越界访问(Buffer Overflow)”,返回的长度是不可预测的随机值(可能是 8,也可能是 100,甚至导致程序崩溃)。因此小伙伴们一定要记住,手动构建字符串时,千万不要忘记末尾的 '\0'。

上一篇: C <string.h> 标准库

下一篇: strcat()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号