前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C进阶:字符串相关函数及其模拟实现

C进阶:字符串相关函数及其模拟实现

作者头像
aosei
发布2024-01-23 13:31:19
1120
发布2024-01-23 13:31:19
举报
文章被收录于专栏:csdn-nagiYcsdn-nagiY

一.strlen

1.功能

计算字符串长度,直到遇到 '\0' ;

2.模拟实现

我们是仿照库函数的方式模拟的,所以先来看看strlen 再库函数里是如何定义的;

这个函数很简单,所以直接上代码:

代码语言:javascript
复制
unsigned my_strlen(const char* str)
{
	assert(str);
	unsigned count = 0;
	while (*str++ != '\0')
	{
		count++;
	}
	return count;
}

这里的 assert ,是用来判断 str 是否是空指针的,且需要包含头文件 <assert.h>;

二.strcpy

1.功能

字符串拷贝函数,将源字符串的内容拷贝到目标空间内;

2.注意事项

1.源字符串必须以 '\0' 结束。 2.会将源字符串中的 '\0' 拷贝到目标空间。 3.目标空间必须足够大,以确保能存放源字符串。 4.目标空间必须可变。

3.模拟实现

这个的实现逻辑同样也很简单,还是直接看代码:

代码语言:javascript
复制
char* my_strcpy(char *dest,char *sour)
{
    assert(dest&&sour);
	char* p = dest;
	while (*dest++ = *sour++)
	{
		;
	}
	return p;
}

三.strcat

1.功能

字符串追加(连接)函数,将一个字符串的内容追加到另一个字符串结束的末尾;

2.注意事项

1.源字符串必须以 '\0' 结束。 2.目标空间必须有足够的大,能容纳下源字符串的内容。 3.目标空间必须可修改。 4.不可以给自己追加。

3.模拟实现

库函数里的定义:

思路一:要找到目标字符串的结尾在哪里,然后再把源字符串的内容追加在后面; 思路二:将目标字符串结尾处作为起始地址,把源字符串内容拷贝进去;

让我们来看代码:

代码语言:javascript
复制
char* my_strcat(char* str1, char* str2)
{
	assert(str1 && str2);
	char* p = str1;
	while (*str1!='\0')    //找到目标字符串的结尾
	{
		str1++;
	}
	while (*str1++ = *str2++)  //字符串追加
	{
		;
	}
	return p;
}

或者根据上面的第二个思路,可以这样写代码:

代码语言:javascript
复制
char* my_strcat(char* str1, char* str2)
{
	assert(str1 && str2);
	char* p = str1;
	while (*str1!='\0')
	{
		str1++;
	}
	strcpy(str1, str2);    //strcpy 代替前面的字符串追加
	return p;
}

四.strcmp

1.功能

字符串比较函数;

2.模拟实现

当要比较的两个字符串有相同字符时,继续向后比较,直到遇到不同的字符,判断其不同字符的大小,如果一直相等,则两字符串相等;

这个函数实现起来也不复杂,代码:

代码语言:javascript
复制
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while ( * str1++ == *str2++)
	{
		if (*str1 == '\0' && *str2 == '\0')   //判断相等
		return 0;
		if (*str1 == '\0' || *str2 == '\0')   //当其中有一方字符串结束时,也跳出循环
			break;
	}
	
	return *str1 - *str2;   //不相等时跳出循环,来到不同字符间的比较
	
}

五.strstr

1.功能

C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。

2.模拟实现

既然是在一个字符串中查找另一个字符串,那么我们肯定是从第1个字符开始,如果相同,那么向后继续查找,如果不同,则换一个查找的起始点,但有时候我们会碰到查找到部分相同的,剩下的部分不相同,这时我们就要换下一个起始点,所以需要一个记录起始点的变量;

请看下图:

具体代码:

代码语言:javascript
复制
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* s1 = str1;
	const char* s2 = str2;
	const char* cp = str1;   //控制起始点
	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 && *s2 && ( * s1++ == *s2++ ))  //防止空字符串
		{
			;
		}
		if (*s2 == '\0')
		{
			return cp;
		}
		
		cp++;
	}
	return NULL;

}

上面是一个一个字符的比较,那我们可不可以直接比较字符串呢?

答案是可以的,我们可以使用 strncmp 函数,这个函数和 前面讲的 strcmp 函数功能一致,但它可以控制比较几个字符;

所以我们把要查找的字符串的长度当作 n ,让它一次性只比较 这 n 个字节,看是否相等,当剩下的字节数小于 n 时,后面肯定找不到相等的了,所以这个时候直接返回 NULL;

具体代码:

代码语言:javascript
复制
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	int len2 = strlen(str2);
	const char* cp = str1;
	while (*cp)
	{
		int ret = strncmp(cp, str2, len2);
		if (ret == 0)
			return cp;
		cp++;
		if (strlen(cp) < len2)
			return NULL;
	}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.strlen
    • 二.strcpy
      • 三.strcat
        • 四.strcmp
          • 五.strstr
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档