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

发布时间:2024年01月02日

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;
}

文章来源:https://blog.csdn.net/qq_52907930/article/details/135312978
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。