C库函数strcmp,memcpy,memmove的模拟实现

strcmp
声明:int strcmp(const char *str1, const char *str2)
功能:C 库函数把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
参数:str1 – 要进行比较的第一个字符串。str2 – 要进行比较的第二个字符串。
返回值:该函数返回值如下
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。

# include <stdio.h>
# include <stdlib.h>
# include <assert.h>
int mystrcmp(const char *str1, const char *str2)
{
	int ret=0;
	assert(*str1 && *str2);
	while (!(ret=*str1-*str2)&& *str2)
		{
			++str1;
	        ++str2;
	    }
	if (ret>0)
		ret=1;
	else if (ret<0)
		ret=-1;
	return ret;
}
int main ()
{
	char str1[]="abuse";
	char str2[]="students";
	char str3[]="student";
	char str4[]="student";
	printf ("%d\n",mystrcmp(str1, str2));
	printf ("%d\n",mystrcmp(str2, str3));
	printf ("%d\n",mystrcmp(str3, str4));
	system ("pause");
	return 0;
}

运行结果:
在这里插入图片描述

memcpy
声明:void *memcpy(void *str1, const void *str2, size_t n)
头文件: C 标准库 - <string.h>

功能:C 库函数从存储区 str2 复制 n 个字符到存储区 str1。(以字节拷贝)
参数:
str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
n – 要被复制的字节数。
返回值:该函数返回一个指向目标存储区 str1 的指针

    # include <stdio.h>
    # include <stdlib.h>
     void  *mymemcpy (void *dst, const void* src,size_t count)
    {
    	void *ret=dst;
    	while (count--)
    	{	
    		*(char*)dst=*(char *)src;
    	      dst=(char *)dst+1;
    		  src=(char *)src+1;	
    	}
    	return (char *)ret;
    }
    int main ()
    {
        char str1[]="abuse power";
    	char str2[]="i am a student";
    	printf ("%s\n",memcpy(str2,str1,4));
    	system ("pause");
    	return 0;
    }

运行结果:
在这里插入图片描述

memmove
声明:void *memmove(void *str1, const void *str2, size_t n)
功能:C 库函数从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

参数:
str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
n – 要被复制的字节数。
返回值:该函数返回一个指向目标存储区 str1 的指针。

    # include <stdio.h>
    # include <stdlib.h>
    void *mymemmove (void *dst, const void* src,size_t count)
    {
    	void *ret=dst;
    	if (dst<=src||(char *)dst>=((char *)src+count))
    		{
    			while (count--)
    		  {
    			*(char*)dst=*(char *)src;
    			 dst=(char *)dst+1;
    			 src=(char *)src+1;	
    		 }
    	   }
    	else
    		{
    	         dst=(char *)dst+count-1;
    			 src=(char *)src+count-1;	
    	    	while (count--)
    	    	 {
	    			*(char*)dst=*(char *)src;
	    			 dst=(char *)dst-1;
	    			 src=(char *)src-1;	
    			 }
    		}
    	return (char *)ret;
    }
    int main ()
    {
    	char str1[]="i am very happy";
    	printf ("%s\n",mymemmove(str1,str1+5,5));
    	system ("pause");
    	return 0;
    }

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/QLH04_04/article/details/84299738