strncpy、strncat、memcpy、memmove的模拟实现

strncpy

原型:char* strncpy(char* dest,const char* src,size_t n)

功能:从源字符串src第一个字符开始复制n个字符到目标字符串dest,返回dest字符串首地址。

注意点:1.dest字符串要足够长,可以容纳n个字符。 2.当src不够n个字符时,会复制src最多的字符。  3.复制完字符后,会在结尾自动添加'\0',作为结束符。

//1.第一种方法
#include <stdio.h>
char* my_strncpy(char* dest,char* src,size_t n)
{
	char* temp = dest;
	while (*src && n)
	{
		*dest++ = *src++;
		n--;
	}
	*dest = '\0';
	return temp;
}
//2.第二种方法
char* my_strncpy1(char* dest, char* src, size_t n)
{
	int i = 0;
	for (i = 0; src[i] && i < n; i++)
	{
		dest[i] = src[i];
	}
	if (i < n)//加不加都行,i肯定小于n
	{
		dest[i] = 0;//'\0'
	}
	return dest;
}

int main()
{
	char ch1[] = "xxxxxxxxxx";
	char ch2[] = "hello world!";
	char ch3[] = "he";
	printf("%s", my_strncpy(ch1, ch3, 5));
	return 0;
}

strncat

原型:char* strncat(char* dest,const char* src,size_t n)

功能:从源字符串src第一个字符开始追加n个字符到目标字符串dest的'\0'处,返回dest字符串首地址。

注意点:1.dest字符串要足够长,可以容纳追加后的字符总数。 2.当src不够n个字符时,会追加src最多的字符。  3.追加完字符后,会在结尾自动添加'\0',作为结束符。

#include <stdio.h>
//第一种方法
char* my_strncat(char* dest, char* src, size_t n)
{
	int x = 0;
	while (dest[x])
	{
		x++;
	}//退出循环后,x偏移对应的dest[x]=0;
	int i = 0;
	for (i = 0; src[i] && i < n; i++)
	{
		dest[x++] = src[i];
	}
	
	dest[x] = 0;//'\0'
	return dest;
}
//第二种方法
char* my_strncat1(char* dest, char* src, size_t n)
{
	int* temp = dest;
	while (*dest)
	{
		dest++;
	}
	int i = 0;
	for (i = 0; src[i] && i < n; i++)
	{
		dest[i] = src[i];
	}
	dest[i] = 0;//'\0'
	return temp;
}
int main()
{
	char ch1[20] = "hello";
	char ch2[] = "hello world!";
	char ch3[] = "he";
	printf("%s", my_strncat(ch1, ch2, 5));
	return 0;
}

memcpy

模拟memcpy     原型:char* memcpy(void* dest,void* src,size n) 
功能:可接收任意相同类型的dest和src,从src复制n个字节到dest,返回dest起始地址

src和dest不能是同一个字符串的不同位置。同一个字符串的不同位置要用到memmove,看下面的memmove的模拟实现。

#include <stdio.h>
#include <assert.h>

void* my_memcpy(void* dest, const void* src, size_t n)
{
	assert(dest && src);
	void* temp = dest;
	while (n--)
	{
		*(char*)dest = *(char*)src;
		((char*)dest)++;
		((char*)src)++;
	}
	return temp;
}
int main()
{
	int a = 0x11223344;
	int b = 0;
	int* p=my_memcpy(&b,&a, 2);
	printf("%#x", *p);
	return 0;
}

memmove

功能:可接收任意相同类型的dest和src,从src复制n个字节到dest,返回dest起始地址   src和dest可以是同一字符串的不同位置

#include <stdio.h>
#include <assert.h>

void* my_memmove(void* dest, const void* src, size_t n)
{
	assert(dest && src);
	void* temp = dest;
	if (dest < src)
	{
		while (n--)
		{
			*(char*)dest = *(char*)src;
			((char*)dest)++;
			((char*)src)++;
		}
	}
	else
	{
		while (n--)
		{
			*((char*)dest+n) = *((char*)src+n);
		}
	}
	return temp;
}
int main()
{
	int a = 0x11223344;
	//int* p = my_memmove(&a, ((char*)&a + 2), 2);//0x11221122
	//printf("%#x", *p);
	my_memmove(((char*)&a + 2), &a, 2);         //0x33443344
	printf("%#x", a);
	return 0;
}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值