模拟实现strncpy,strncat,strncmp

【模拟实现strncpy】【模拟实现strncat】【模拟实现strncmp】
这三个函数都是在字节上进行实现
【strncpy】
char* strncpy(char* destination,const char* source,size_t num);
拷贝num个字符从源字符到目标空间,如果源字符串的长度小于num,则考完源字符串之后,在目标的后边追加0,直到num个。

char* my_strncpy(char* dest, const char*src, size_t num)
{
	char* ret = dest;
	assert(dest);//检测dest是否存在,不为NULL
	assert(src);
	while (num)
	{
		*dest++ = *src++;//一个字节一个字节拷贝
		num--;
		if ((*src == '\0') )
		{
			*dest++ = '\0';
			return ret;//返回目标字符串
		}
	}
	return ret;
}

【strncat】
char* strncat(char* destination,const char* source,size_t num);
把源字符串的num个字符拼接到目标字符串,在拼接字符串的时候,它会默认给你加上’\0’。

char* my_strncat(char* dest, const char* src, size_t num)
{
	char* ret = dest;
	assert(dest);//检测dest是否存在,不为NULL
	assert(src);
	while (*dest)
	{
		dest++;//先找到目标字符串的末端位置
	}
	while (num)
	{
		*dest++ = *src++;//从末端往后开始一个一个的拼接
		num--;
	}
	*dest++ = '\0';//拼接完成后在目标字符串后加上'\0'
	return ret;//返回目标字符串
}

【strncmp】
int strncmp(const char* str1,const char* str2,size_t num);
按字节比较两个字符串,比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

int my_strncmp(const char* str1, const char* str2, size_t num)
{
	assert(str1);//检测dest是否存在,不为NULLw
	assert(str2);
	int ret = 0;
	while (num)//比较num次
	{
		ret = *(unsigned char*)str1 - *(unsigned char*)str2;
		str1++;
		str2++;
		if (ret < 0)
			return -1;
		else if (ret>0)
			return 1;
	}
	return ret;
}

列子:

//能看出来,这个函数是将六个字符串里以A4开头的字符串找出来
int test()
{
	char str[][6] = { "A499", "BF77", "3456", "A401", "A4HJ", "B612" };
	int n;
	puts("Looking for A4 ...\n");
	for (n = 0; n < 6; n++)
	{
		if (strncmp(str[n], "A4xx", 2) == 0)//找到啦就打印
			printf("%s\n", str[n]);
	}
	return 0;
}

如果有不对的地方,可以评论告诉我,望指导!

你可能感兴趣的:(c,模拟实现,strncpy,strncat,strncmp)