C 语言的字符串函数 strlen()

概述

属于 string.h 头文件.

实参是一个字符串。

返回值是字符串的字符个数, 不包括空字符。因为strlen 函数从字符串开头向后依次计数,直到遇见 \0,最终统计的字符串长度不包括 \0

返回值应为 size_t 类型.

函数原型:

size_t strlen(const char* str);

参数 str 表示要求长度的字符串。

返回值:字符串 str 的长度。

字符串长度是指字符串包含的字符个数 (不包括结束符 '\0')。

程序示例:

#include <stdio.h>
#include <string.h>  // 提供 strlen() 函数的原型
int main(void)
{
	char str[10] = "hello";
	long len = strlen(str);
	printf("The length of this string is %ld.\n", len);
	return 0;
}

结果:

The length of this string is 5.

strlen() 遇到 \0 结束记数:

程序示例:

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

int main(void)
{
	char arr1[] = "abc";
	char arr2[] = { 'a','b','c' };
	char arr3[] = { 'a','b','c', 0 };
	char arr4[] = { 'a','b','c','\0'};
	printf("%zd\n", strlen(arr1));
	printf("%zd\n", strlen(arr2));
	printf("%zd\n", strlen(arr3));
	printf("%zd\n", strlen(arr4));

	return 0;
}

结果:

3
35
3
3

分析: strlen 函数向后计数, 直到遇到字符串结束符, 对于这里的 arr2, 没有明确给出一个结束符, 那么 strlen 计数时将一直向后寻找直到找到内存中某处刚好存在着的空字符, 将其当作结束符, 因此最终计数结果很奇怪.

strlen() 的返回值应为 size_t 类型, 用 printf() 输出时可用 %zd 格式控制符.

程序示例:

#include <stdio.h>
#include <string.h>
int main(void)
{
	char str[10] = "hello";
	size_t len = strlen(str);
	printf("The length of this string is %zd.\n", len);
	return 0;
}

结果:

The length of this string is 5.

当 strlen() 遇到转义字符

程序示例:

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

int main(void)
{
	printf("%zd\n", strlen("c:\today\12\today1.c"));

	return 0;
}

结果:

16

分析: 这里 \t, \12, \t 均为一个字符.

strlen 函数和 sizeof 运算符的差别

作用于字符数组

sizeof 运算符作用于字符数组时, 返回字符数组占用的字节个数, 等于数组的元素个数.

strlen 函数作用于字符数组时, 从第一个元素开始向后计算字符个数, 直到遇到空字符, 返回值是空字符前面的字符个数. 此时要注意空字符在什么位置.

作用于字符串字面量

sizeof 作用于字符串字面量时,返回值为字符个数加一。

strlen 作用于字符串字面量时,返回值为字符个数。

为字符数组赋值的几种情况

指定字符数组元素个数, 赋给字符串字面量

程序示例:

#include<stdio.h>
#include<string.h>
int main(void)
{
	char str1[10] = "ok";   // 是字符数组, 同时也是字符串
	printf("sizeof str1 is %zd.\n", sizeof(str1));
	printf("strlen of str1 is %zd.\n", strlen(str1));
	return 0;
}

结果:

sizeof str1 is 10.
strlen of str1 is 2.

添加断点进行调试, 观察 str1 中元素的变化情况:

添加断点的示意图:

在这里插入图片描述

运行至断点处时, str1 中元素的值:

在这里插入图片描述
逐语句调试, 向下继续运行一条语句, 如图:

在这里插入图片描述

此时 str1 中元素的值:

在这里插入图片描述
可以看出, 除了前面的指定了元素的位置, 后面没有指定元素的位置, 都自动变成了空字符. 索引为 2 的元素是空字符是因为赋值了一个字符串字面量, 其最后一个元素是空字符, 索引为 2 的元素后面的其他所有元素都是空字符则是自动进行的.

指定字符数组元素个数, 赋给单个的字符, 不包括空字符

程序示例:

#include<stdio.h>
#include<string.h>
int main(void)
{
	char str1[10] = {'o','k'};
	printf("sizeof str1 is %zd.\n", sizeof(str1));
	printf("strlen of str1 is %zd.\n", strlen(str1));
	return 0;
}

结果:

sizeof str1 is 10.
strlen of str1 is 2.

添加断点进行调试, 观察 str1 中元素的变化情况:

添加断点的示意图:

在这里插入图片描述

运行至断点处时, str1 中元素的值:

在这里插入图片描述

逐语句调试, 向下继续运行一条语句, 如图:

在这里插入图片描述

此时 str1 中元素的值:

在这里插入图片描述
可以发现, 当指定了字符数组的元素的个数时, 不论赋给字符数组的是字符串字面量还是单个的字符 (不包含空字符), 最后字符数组中多出来的位置都会被自动赋给空字符, 字符数组都会变成字符串.

没有指定字符数组元素个数, 赋给字符串字面量

#include<stdio.h>
#include<string.h>
int main(void)
{
	char str1[] = "ok";
	printf("sizeof str1 is %zd.\n", sizeof(str1));
	printf("strlen of str1 is %zd.\n", strlen(str1));
	return 0;
}

结果:

sizeof str1 is 3.
strlen of str1 is 2.

打断点示意图:

此时 str1 中元素的值:

在这里插入图片描述
逐步运行程序, 向下运行程序一步, 得到 str1 中各个元素的值:

在这里插入图片描述
此处是将字符串常量 “ok” 赋值给字符数组,字符串常量 “ok” 包含了三个字符,这三个字符都被赋给了 str1.

str1 在定义时未指定元素个数,所以数组长度正好放下这三个元素,即数组长度为3.

没有指定字符数组元素个数, 赋给单个的字符, 不包含空字符

程序示例:

#include<stdio.h>
#include<string.h>
int main(void)
{
	char str1[] = {'o','k'};
	printf("sizeof str1 is %zd.\n", sizeof(str1));
	printf("strlen of str1 is %zd.\n", strlen(str1));
	return 0;
}

结果:

sizeof str1 is 2.
strlen of str1 is 42.

数组元素未指定, 则刚好等于元素个数, 即 2.

因为没有指定空字符, strlen 计数时一直向后找到内存中刚好存在的空字符.

打断点进行调试, 如图:在这里插入图片描述

此时 str1 的内部元素的值:

在这里插入图片描述
逐步运行程序, 向下运行程序一步, 得到 str1 中各个元素的值:

在这里插入图片描述

strlen 和 sizeof 的返回类型

C99之后, strlen 和 sizeof 返回类型为 size_t, 用 printf 打印时的转换说明为 %zd.

在这之前, strlen 和 sizeof 返回类型为 unsigned 或 unsigned long, 这和具体的实现有关. 用 printf 打印时的转换说明为 %u 或 %lu.

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值