【C语言】常用字符串函数及其模拟实现

🚀🚀前言

大家好,本文主要深度讲解常用字符串函数的细节,并且模拟实现一遍,收录到C—语法专栏,定期更新C语言语法方面知识,都是比较详细的,自己复习的同时也希望能帮助到大家,如果有不对或者不足的地方欢迎评论区补充。

🏡个人主页:悲伤的猪大肠9的博客-C语言领域博主

✨如果文章对你有帮助记得点赞收藏关注哦!!✨

🌈重要的不是成功,而是奋斗的过程

本章重点:

重点介绍常用处理字符串的库函数的使用以及注意事项,并且模拟实现,便于更深刻的理解下列函数。

strlen() 求字符串长度

strcpy() 复制字符串

strcmp() 比较两个字符串大小

strcat() 字符串拼接

strstr() 在其他字符串中查找是否有子串

一、strlen()

size_t strlen ( const char* str )

用于计算字符串长度

注意事项

  • 字符串遇到 ‘ \0 ’ 结束,函数返回的长度不包括 ’ \0 ‘
  • 注意传进来的字符串必须要以 ’ \0 ‘ 结尾否则直到在内存中遇到 ‘ \0 ’ 才会停止 ,相当于随机值
  • 函数返回值是size_t

模拟实现🍉

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>

int my_strlen(const char* pc)
{
	assert(pc);
	int count = 0;
	while (*pc++)    //遇到'\0'结束
	{
		count++;
	}
	return count;
}
int main()
{
	char c[] = "adfafds";
	printf("%d", my_strlen(c));   //7
	return 0;
}

在这里插入图片描述

二、strcpy()

char* strcpy(char* destination , const char* source)

用于拷贝一个字符数组或字符串到另一个字符数组里面

注意事项

  • 源字符串必须要以 ’ \0 ‘ 结尾
  • 目标空间必须足够大,否则会报错
  • 目标空间不能为常量字符串,常量不能修改
  • 拷贝的时候会把源字符串的 ‘ \0 ’ 也拷贝过去

🍎模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* s1,const char* s2)
{
	assert(s1&&s2);
	char* ret = s1;		//记录指针首地址
	while (*s1++ = *s2++);	//将字符串拷贝
	return ret;
}
int main()
{
	char s1[20] = "ahunb";
	char s2[] = "tiantianxiangshang";	
	printf("%s", my_strcpy(s1, s2));	//tiantianxiangshang
}	

在这里插入图片描述

三、strcmp()

int strcmp (const char* str1,const char* str2)

用于比较两个字符串大小(注意不是比较长短,而是逐个比较,一旦遇到不相等的就返回)

第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字

🥝模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* s1, const char* s2)
{
	assert(s1 && s2);
	while (*s1 == *s2)	//判断每个字符是否相等
	{
		if (*s1 == '\0' && *s2 == '\0')  //两个都到'\0'证明已经到字符串末尾了还没有不相等,则相等返回0
		{
			return 0;
		}
		s1++;
		s2++;
	}
	return *s1 - *s2;//如果不想打则跳出上面循环,返回*s1-*s2 ,S1如果比S2大返回的就是大于0的数,反之返回小于0的数
}
int main()
{
	char* s1 = "abbbcdefg";
	char* s2 = "abbcdefg";
	if (my_strcmp(s1, s2) > 0)
	{
		printf(">");
	}
	else if (my_strcmp(s1, s2) < 0)
	{
		printf("<");
	}
	else
	{
		printf("=");
	}
}

四、strcat()

char* strcat (char* destination,const char* source)

用于在一个字符串后面接上另一个字符串

注意事项

  • 源字符串必须以 ‘ \0 ’ 结束
  • 目标空间不能为常量字符串,因为常量字符串不能修改
  • 目标空间必须足够大,否则会报错

🍐模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* s1,char*s2)
{
	assert(s1 && s2);
	char* ret = s1;
	while (*s1)
	{
		s1++;			//先遍历到数组末尾
	}
	while (*s1++ = *s2++); //追加字符串直到'\0'
	return ret;
}
int main()
{
	char s1[20] = "hahaha";
	char s2[] = "haokaixin";
	printf("%s", my_strcat(s1, s2));
}

在这里插入图片描述

五、strstr()

char* strstr(const char* str1,const char* str2)

查询第一个子串中有没有第二个字符串(是否包含第二个字符串)

🍈模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>

char* my_strstr(char* s1, char* s2)
{
	assert(s1 && s2);
	char* pstr1 = s1;
	char* pstr2 = NULL;
	char* cur = pstr1;	//指针当前位置
	while(*cur)
	{
		pstr1 = cur;
		pstr2 = s2;
		while (*pstr1 == *pstr2)
		{
			pstr1++;
			pstr2++;
			if (*pstr2 == '\0')		//如果pstr2是'\0'还没有跳出循环证明有子串
			{
				return cur;
			}
		}
		cur++;
	}
	return NULL;	//如果cur为’\0‘还没找到就返回空指针
}
int main()
{
	char s1[] = "haohaoxuexi";
	char s2[] = "hsaosdasfdi";
	printf("%s", my_strstr(s1, s2));
}

在这里插入图片描述


完结

创作不易,还请各位小伙伴多多点赞👍关注✨收藏⭐

请添加图片描述

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值