C库函数——自己实现str类函数

本篇主要实现strlen、strcpy、strcat、strcmp、strstr

strlen函数

功能:
返回C字符串str的长度。
C字符串的长度由终止空字符来确定:一个C字符串是字符串的开头和终止空字符之间的字符数(不包括终止空字符本身)。
声明:
官方给出函数声明:size_t strlen ( const char * str );
size_t保证了返回值为正数,const保证了不会修改所传字符串
实现:

size_t my_strlen(const char *p)
{
	assert(p);
	const char* end = p;
	while (*end)
	{
		++end;
	}
	return end - p;
}
int main()
{
	char* p = "qwer";
	printf("%d",my_strlen(p));//4
	return 0;
}
strcpy函数

功能:
将source指向的C字符串复制到destination指向的数组中,包括终止的空字符(并在该点处停止)。
为避免溢出,由destination指向的数组的大小应足够长,以包含与source相同的C字符串(包括终止空字符),并且在内存中不应与source重叠。
声明:
官方给出函数声明:char * strcpy ( char * destination, const char * source );
返回值是 destination的地址指针,const保证了不会修改原字符串
实现:

char* my_strcpy(char *a, const char *p)
{
	assert(a);
	assert(p);
	char* ret = a;
	while (*a++ =*p++){}
	return ret;
}
int main()
{
	char* p = "qwer";
	char s[10];
	printf("%s", my_strcpy(s,p));//qwer
	return 0;
}
strcat函数

功能:
将源字符串source的副本附加到目标字符串destination后。destination中终止的空字符将被source的第一个字符覆盖,并且在destination中两个字符的串联所形成的新字符串的末尾将包含一个空字符。
目的地和来源不得重叠。
声明:
官方给出函数声明:char * strcat ( char * destination, const char * source );
返回值是 destination的地址指针,const保证了不会修改原字符串
实现:

char* my_strcat(char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	char* ret = str1;
	while (*str1)
	{
		str1++;
	}
	while ((*str1 = *str2) != '\0')
	{
		str1++;
		str2++;
	}
	return ret;
}
int main()
{
	char p1[9] = "qwer";
	char p2[] = "qwer";
	printf("%s", my_strcat(p1, p2));//qwerqwer
	return 0;
}
strcmp函数

功能:
比较C字符串str1和C字符串str2。
此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以比较下一个,直到字符不同或到达终止的空字符为止。
声明:
官方给出函数声明:int strcmp ( const char * str1, const char * str2 );
const保证了不会修改原字符串
返回一个整数值,指示字符串之间的关系:

返回值表示
<0第一个不匹配的字符在str1中的值比在str2中的值低
0两个字符串的内容相等
>0第一个不匹配的字符在str1中的值大于在str2中的值

实现:

int my_strcmp(const char* str1, const char* str2)
{
	while (*str1 && *str2)
	{
		if (*str1 > * str2)
		{
			return 1;
		}
		else if (*str1 < *str2)
		{
			return -1;
		}
		else
		{
			++str1;
			++str2;
		}
	}
	if (*str1 == '\0' && *str2 != '\0')
	{
		return -1;
	}
	else if (*str1 != '\0' && *str2 == '\0')
	{
		return 1;
	}
	else
	{
		return 0;
	}
	}

int main()
{
	char* p1 = "wer";
	char* p2 = "qwer";

	printf("%d\n", my_strcmp(p1, p2));//1
	printf("%d\n", my_strcmp(p2, p1));//-1
	printf("%d\n", my_strcmp(p2, p2));//0

	return 0;
}
strstr函数

功能:
比较C字符串str1和C字符串str2。
此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以比较下一个,直到字符不同或到达终止的空字符为止。
声明:
官方给出函数声明:char * strstr ( const char *, const char * );
str1:要扫描的C字符串。
str2: C字符串,包含要匹配的字符序列。
返回值:指向str2中指定的整个字符序列在str1中第一次出现的指针,或者如果str1中不存在该序列,则返回 null指针。
实现:

const char* my_strstr(const char* str1,const char* str2)//str1是原文档str2是要找的字符
{
	const char* start = str1;
	const char* sup = str2;
	while(*start)
	{
		while (*str1 == *sup && *sup != '\0')
		{
			str1++;
			sup++;
		}
		if(*sup == '\0')
		{
			return start;
		}
		else
		{
			str1 = start +1;
			sup = str2;
			start++;
		}
	}
	return NULL;
}
int main()
{
	char *p1 = "qwerwt";
	char *p2 = "wt";
	
	printf("%s\n",my_strstr(p1,p2));
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值