【C语言】字符串函数的模拟实现大全

字符串函数的模拟实现
Ciallo~ (∠・ω< )⌒★

1. strlen

函数原型:

size_t strlen ( const char * str );

功能:

字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包含 '\0' )

模拟实现:

//模拟实现strlen
size_t my_strlen(const char* str)  //注意返回值类型是size_t,是无符号的
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

2. strcpy

函数原型:

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

注意:

源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。

模拟实现:

模拟实现strcpy
char* my_strcpy(char* des, char* str)
{
	char* ret = des;
	while (*des++ = *str++) //先解引用赋值,再加一
	{
		;
	}
	return ret;
}
// 在C和C++中,赋值语句的返回值是赋值操作的结果,即被赋予的值。
// 这意味着,当你执行一个赋值操作时,该操作将返回被赋的值,而不是一个表示成功或错误的状态码。

3. strcat

函数原型:

char* my_strcat(char *dest, const char*src)

注意:

源字符串必须以 '\0' 结束。
⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

模拟实现:

char* my_strcat(char *dest, const char*src)
{
 	char *ret = dest;
 	assert(dest != NULL);
 	assert(src != NULL);
 	while(*dest) //先找到\0的位置
 	{
 		dest++;
 	}
 	while((*dest++ = *src++)) //追加
 	{
 		;
 	}
 	return ret;
}

4. strcmp

模拟实现:

int my_strcmp (const char * str1, const char * str2)
{
 	int ret = 0 ;
 	assert(str1 && str2);
 	while(*str1 == *str2)
 	{
 		if(*str1 == '\0')
 		return 0;
 		str1++;
 		str2++;
 	}
 	return *str1-*str2;
}

5. strncpy

函数原型:

char * strncpy ( char * destination, const char * source, size_t num );

注意:

拷贝num个字符从源字符串到目标空间。
如果源字符串的⻓度⼩于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

模拟实现:

char* my_strncpy(char* des, const char* str, size_t num)
{
	char* ret = des;
	while (num && (*des++ = *str++))
	{
		num--;
	}
	if (num) // 如果num比str长的话,缺几个就补几个\0
	{
		while (num--)
		{
			*des++ = '\0';
		}
	}
	return ret;
}

6. strncat

函数原型:

char * strncat ( char * destination, const char * source, size_t num );

注意:
该函数时将 source 指向字符串的前 num 个字符追加到 destination 指向的字符串末尾,再追加⼀个 \0 字符。
如果 source 指向的字符串的长度小于 num 的时候,只会将字符串中到 \0 的内容追加到 destination 指向的字符串末尾。

模拟实现:

char* my_strncat(char* des, const char* src, size_t num)
{
	char* cur = des;
	while (*cur != '\0')
	{
		cur++;
	}
	while (num && (*cur++ = *src++))
	{
		num--;
	}
	*cur = '\0';
	return des;
}

7. strncmp

函数原型:

int strncmp ( const char * str1, const char * str2, size_t num );

模拟实现:

//模拟实现strncmp
int my_strncmp(char* str1, char* str2, size_t num)
{
	while (num--)
	{
		if (*str1 == *str2)
		{
			if (*str1 == '\0')
			{
				break;
			}
			else
			{
				str1++;
				str2++;
			}
		}
		else
			return (*str1 - *str2);
	}
	return 0;
}

8. strstr

函数原型:

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

功能:
查找 str2 是否在 str1 中出现,若是,则返回起始元素地址。否,则返回空指针。

模拟实现:

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* cur = str1;
	const char* s1 = NULL;
	const char* s2 = NULL;
	while (*cur)
	{
		s1 = cur;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)cur;
		}
		cur++;
	}
	return NULL;
}

五颜六色的生活,不能乱七八糟的过。
友友们,你们很棒了,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值