C语言进阶(九) - 字符与字符串函数 - 1 - strlen()

前言

C语言中有着字符类型,但是没有字符串类型。库函数中有着许多处理字符和字符串的函数供我们使用。
字符串可以放在字符数组中,也可以放在常量字符串中。


1. strlen()函数

1.1 strlen()的函数声明

}NVG5@P7DCHHVN}`1DXLVAT.png
点击转到cpluscplus.com官网 - strlen

stelen()函数接收一个字符串的地址,返回字符串的长度,返回类型是size_t
size_t类型就是unsigned int类型。

  • 字符串以'\0'作为结束标志,返回的是在字符串中'\0'前面出现的字符个数。不包含字符'\0'
  • 参数指向的字符串必须要以'\0'结束。
  • 函数的返回值是size_t,是无符号的。

2.2 模拟实现

2.2.1 计数法

//模拟实现strlen
#include <stdio.h>
#include <assert.h>

//计数法
size_t my_strlen1(const char* str) {
    //断言,如果str是空指针就报错
	assert(str);
    //记录字符串的长度
	size_t count = 0;
    //一个循环,直到字符串为'\0'时结束循环并停止计数
	while (*str) {
		str++;
		count++;
	}
	return count;
}

int main() {
	char str[] = { "abcdef" };
	int ret1 = my_strlen1(str);
    
	printf("%d\n", ret1);

	return 0;
}

运行结果:
)2)EV1@%000@O@JKRN1CV(6.png

2.2.2 指针相减法

//模拟实现strlen
#include <stdio.h>
#include <assert.h>

//指针相减法
size_t my_strlen2(const char* str){
    //断言,如果str是空指针就报错
	assert(str);
    //创建一个字符指针,指向字符串的首元素
	const char* start = str;
    //如果当前字符不是'\0',指针就指向下一个字符串
	while (*str != '\0') {
		str++;
	}
    //两个指针相减,且是高地址减去低地址,得到二者之间的字符个数
	return str - start;
}

int main() {
	char str[] = "abcdef";

	int ret2 = my_strlen2(str);

	printf("%d\n", ret2);

	return 0;
}

运行结果:
)2)EV1@%000@O@JKRN1CV(6.png

2.2.3 递归法

//模拟实现strlen
#include <stdio.h>
#include <assert.h>

//递归法
size_t my_strlen3(const char* str) {
    //断言,如果str是空指针就报错
	assert(str);
    //递归要有渐进条件和出口。
    //如果当前指针指向字符不是'\0',就要记录并且计算指针指向下一个字符的字符串的大小
    //如果是'\0',就不记录并返回0。
	if (*str) {
		return my_strlen3(str + 1) + 1;
	}
	else {
		return 0;
	}
}

int main() {
	char str[] = "abcdef";

	int ret3 = my_strlen3(str);

	printf("%d\n", ret3);

	return 0;
}

运行结果:
)2)EV1@%000@O@JKRN1CV(6.png

结语

多种方法模拟实现库函数之strlen()


END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

re怠惰的未禾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值