C语言strlen,strcpy ,strcat, strcmp,strstr常用库函数的理解与模拟实现

前言

本篇文章主要学习一下常见的库函数和模拟实现这些库函数,这篇文章可以加深我们对这些函数的理解。

一、strlen

这个函数是用来求字符串长度的,实现逻辑是: ‘\0’ 作为字符串的结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包
含 ‘\0’ )。返回值类型为无符号整形。
我们来看一下这个函数如何用:
在这里插入图片描述
在这里插入图片描述
这个用起来并不难,传首元素地址过去,就能计算出字符串的长度。下面我们来看一下strlen的模拟实现:

#include <stdio.h>
#include <assert.h>
#include <string.h>
size_t my_strlen(const char *p)     //计数器法
{    
	int count = 0;
	assert(p != NULL);
	while (*p != '\0')
	{
		count++;
		p++;
	}
	return count;
}
int main(){
char arr[] = "abcde";
unsigned int len=my_strlen(arr);
printf("%d", len);
	return 0;
}


这里加入了assert和const分别来保证不为空指针和字符串不被修改。

二、strcpy

这个函数的功能是实现字符串的拷贝,举例:把字符串2的内容拷贝到字符串1里面去
在这里插入图片描述
在这里插入图片描述
注意:1.源字符串必须以\0结束。
2.会将\0拷贝过去。
3.目标空间必须够大,确保能存放的下源字符串的内容。
4.目标空间必须可变。
我们再来看一下strcpy函数的模拟实现:
代码:

#include <stdio.h>
#include <string.h>
#include <assert.h>
char * my_strcpy(char *p1, const char *p2) {
    assert(p1 && p2);
	char* ret = p1;   
	while (*p1++ = *p2++)
	{
		;
	}
	return ret;
}
int main(){
	char arr1[10] = {0};
	char arr2[] = "abcde";
    printf("%s", my_strcpy(arr1, arr2));
	return 0;
}

这里注意,由于strcpy函数的返回类型为目标空间的起始地址。
在这里插入图片描述
所以我们刚开始要把起始地址保存起来,作为函数的返回值。
还有我们用assert断言p1和p2不能为空指针。const限制字符串的内容不能被改变,这些都是需要注意的点。

三丶strcat

这个函数的作用是字符串追加,把一个字符串的内容放到另一个字符串后面去,我们来举个例子:
在这里插入图片描述
在这里插入图片描述
这就是这个函数大体的用法。
这个函数有几个需要注意的地方:1.源字符串必须以 ‘\0’ 结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。
3. 目标空间必须可修改。
下面我们来模拟实现一下这个函数:
代码:

#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* p1, char* p2) {
	assert(p1 && p2);  //确保p1和p2不为空指针
	char ret = p1;
	while (*p1)
	{
		p1++;      //找到第一个数组中的\0
	}
	while (*p1++ = *p2++)
	{
		;           //从第一个数组的\0开始,把第二个数组中的元素追加过去。
	}
	return ret;
}
int main(){
	char arr1[20] = "hello";
	char arr2[] = "world";
	my_strcat(arr1, arr2);
    printf("%s",arr1 );
	return 0;
}

结果和上边的一样,说明我们的模拟的代码是正确的。
在这里插入图片描述

四丶strcmp

这个函数是比较字符串大小的。
注意:这里比较的规则不是比较字符串长度,而是比较对应位置上字符的ASCII码值的大小,如果第一个位置相等,就去比较下一对,直到不相等或者都遇到了\0。
这个函数的返回值为整数(int):如果都相等,返回0,大于的话返回大于0的数,小于的话返回小于0的数。
这是msdn上对这个函数返回值的解释:
在这里插入图片描述
我们来举个例子:
在这里插入图片描述
arr1末尾的o的ASCII值是要大于arr2末尾的a的,所以返回大于0的数。
在这里插入图片描述
我们当前编译器返回的是1。
我们下面来学习一下如何模拟实现这个函数:
代码:

#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_strcmp(const char* p1, const char* p2)
{
	assert(p1 && p2);
	while (*p1 == *p2)
	{
		if (*p1 == '\0')
			return 0;
		p1++;
		p2++;
	}
	if (*p1 > *p2)
	{
		return 1;
	}
}
int main(){
	char arr1[] = "hello";
	char arr2[] = "hella";
	int ret=my_strcmp(arr1, arr2);
    printf("%d",ret );
	return 0;
}

运行结果和上面也是一样的,说明我们的代码逻辑没有问题。
在这里插入图片描述

五丶strstr

strstr这个函数可以理解为查找字符串,返回第一次找到目标字符串的首元素地址,如果找不到就返回空指针,下面这个图片是msdn上对strstr这个函数返回值的解释。

在这里插入图片描述
我们来举个例子:
在这里插入图片描述
由于在arr1中找到了arr2中的cdef,所以这里返回c的地址,然后打印出来,打印的是c和后面的字符串,我们来看一下运行结果:
在这里插入图片描述
下面我们也是对这个函数进行模拟实现:
代码:

#include <stdio.h>
#include <string.h>
char* my_strstr(char* p1, char* p2) {
	char* s1 = p1;
	char* s2 = p2;
	char* cur = p1;
	while (*cur)
	{
		s1 = cur;
		s2 = p2;
		while (*s1 == *s2 && *s1 && *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cur;
		}
		cur++;
	}
	return NULL;
}
int main() {
	char arr1[] = "abcdefhij";
	char arr2[] = "cdef";
	char* ret = my_strstr(arr1, arr2);
	printf("%s", ret);
	return 0;
}

运行结果和上面的是一致的,说明代码逻辑是正确的。

总结

本篇文章学习了C语言常用的库函数,这些函数会对我们以后写代码有所帮助。
本篇文章内容结束,感谢大家观看。如果意见或建议,可以在评论区留言,您的点赞是我更新的动力。我们下篇文章再见。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
"C语言字符串处理库函数大全-简书"是一篇在简书上的教程,介绍了C语言常用的字符串处理库函数。 该教程详细介绍了C语言字符串操作的相关函数,包括库函数的使用方法和示例代码。通过该教程,读者可以学习到如何使用C语言的字符串处理函数来进行字符串的复制、连接、比较、查找、截取等操作。 在这篇教程,读者可以了解到以下一些常见的字符串处理库函数: 1. strcpy:用于将一个字符串复制到另一个字符串。 2. strcat:用于将一个字符串连接到另一个字符串的末尾。 3. strlen:用于计算一个字符串的长度。 4. strcmp:用于比较两个字符串的大小。 5. strchr:用于在一个字符串查找指定字符的第一次出现位置。 6. strstr:用于在一个字符串查找指定子串的第一次出现位置。 7. strtok:用于将一个字符串按照指定的分隔符分割成多个子串。 8. strncpy:用于将指定长度的字符串复制到目标字符串。 9. strncmp:用于比较指定长度的两个字符串。 10. sprintf:用于将格式化的字符串输出到一个字符数组。 这些函数在C语言非常常用,并且对于字符串的处理非常方便。通过学习和掌握这些字符串处理库函数,可以更加高效地完成C语言程序的字符串操作。 总之,"C语言字符串处理库函数大全-简书"这篇文章提供了丰富的字符串处理库函数以及示例代码,对于C语言开发者来说是一个很好的参考和学习资料。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT牛爷爷

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

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

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

打赏作者

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

抵扣说明:

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

余额充值