【C语言】strcpy/strcat/strcmp/memcpy/memmove(n)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41035588/article/details/83308555

strcpy/strncpy/strcat/strncat/strcmp/strncmp/memcpy/memmove

功能介绍如下:

strcpy:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间,src和dst所指内存区域不可以重叠且dst必须有足够的空间来容纳src的字符串,返回指向dst的指针。

strncpy:是 C语言的库函数之一,char *strncpy(char *dst, const char *src, int n),把src所指向的字符串中以src地址开始的前n个字节复制到dst所指的数组中,并返回dest。

strcat:把src所指字符串添加到dst结尾处(覆盖dst结尾处的’\0’),src和dst所指内存区域不可以重叠且dst必须有足够的空间来容纳src的字符串,返回指向dst的指针。

strncat:把src所指字符串的前n个字符添加到dst所指字符串的结尾处,并覆盖dst所指字符串结尾的’\0’,从而实现字符串的连接,src和dst所指内存区域不可以重叠,并且dst必须有足够的空间来容纳src的字符串,返回指向dst的指针。

strcmp:设这两个字符串为str1,str2,若str1=str2,返回0;str1>str2,返回正数;str1<str2,返回负数。

strncmp:这个函数用来比较s1和s2字符串的前maxlen个字符。如果两个字符串相等的话,strncmp将返回0。如果s1是s2的一个子串的话,s1小于s2。此外还有,函数 int strncmp (const char *s1, const char *s2, size_t size) 此函数与strcmp极为类似。不同之处是,strncmp函数是指定比较size个字符。也就是说,如果字符串s1与s2的前size个字符相同,函数返回值为0。

memcpy:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dst所指的内存地址的起始位置中。

memmove:用于从src拷贝count个字节到dst,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

附加

memmove/memcpy/strcpy的区别

strcpy:只能复制字符串,且没有指定的复制长度,党遇到’\0’的时候结束,容易溢出。

memcpy:可以复制任意内容,比如字符串,整形,结构体,类等,根据第三个参数进行复制指定长度。

memmove:可以复制任意类型,与memcpy唯一区别就是,当内存发生局部重叠的时候memmove可以保证复制的结果时正确的,但memcpy不能保证。

#include <stdio.h>
#include <Windows.h>
#include <assert.h>
#include <string.h>
//strcpy
char *my_strcpy(char *dst,const char *src)	
{
	char *ret = dst;
	assert(dst&&src);
	while(*dst++ = *src++);
	return ret;
}
//strncpy
char *my_strncpy(char *dst,const char *src,int len )
{
	char *ret = dst;
	assert(dst && src);
	while(len && (*dst++=*src++))
	{
		len--;
	}
	if(len > 0)
	{
		while(--len)
		{
				*dst++ = '\0';
		}
	}
	return ret;
}
//strcmp
int my_strcmp(const char *str1,const char *str2)
{
	assert(str1&&str2);
	while(*str1 != '\0' && *str2 != '\0')
	{
		if(*str1 == *str2)
		{
			str1++;
			str2++;
		}
		else if(*str1 > *str2)
		{
			return 1;
		}
		else 
		{
			return -1;
		}
	}
	if(*str1 != '\0' && *str2 == '\0')
		return 1;
	if(*str1 == '\0' && *str2 != '\0')
		return -1;
	return 0;
}
//strncmp
int my_strncmp(const char *arr1,const char *arr2,int len)
{
	assert(arr1 && arr2);
	while(len && (*arr1==*arr2))
	{
		if(arr1=='\0')
			return 0;
		arr1++,arr2++,len--;
	}
	return *arr1-*arr2;
}
//strcat
char* my_strcat(char *dst,char *src)
{
	char *ch = dst;
	assert(dst&&src);
	while(*dst != '\0')
	{
		*dst++;
	}
	while(*src != '\0')
	{
		*dst++ = *src++;
	}
	*dst = '\0';
	return ch;
}
//strncat
char* my_strncat(char *dst,const char *src,int len)
{
	char *ret = dst;
	assert(dst&&src);
	while(*dst != '\0')
	{
		*dst++;
	}
	while(len && *src)
	{
		*dst++ = *src++;
		len--;
	}
	*dst='\0';
	return ret;
}
//memcpy
char* my_memcpy(char* dst, const char* src, int n)
{
	assert(src && n > 0);
	char* ret = dst;
	while (*dst != '\0')
		dst++;
	while (n-- > 0 && *src != '\0')
		*dst++ = *src++;
	*dst = '\0';
	return ret;
}
//memmove
void *my_memmove(void *dst,void *src,int n)
{
	void *ref = dst;
	char *arr3 = (char*)dst;
	char *arr4 = (char*)src;
	assert(dst&&src);
	if(arr3 > arr4)
	{
		while(n--)
		{
			*(arr3 + n) = *(arr4 + n);
		}

	}
	else
	{
		while(n--)
		{
			*arr3++ = *arr4++;
		}
	}
	return ref;
}
void show(int *arr4,int x)
{
	int i = 0;
	printf("memcpy:  ");
	for(i = 0;i < x;i++)
	{
		printf("%d",arr4[i]);
	}
	printf("\n");
}
void show_move(int *arr5,int *arr4,int n)
{
	int i = 0;
	printf("memmove: ");
	for(i = 0;i < 10 ; i++)
	{
		printf("%d",arr5[i]);
	}
	printf("\n");
}
int main()
{
	const char *msg = "my Dream is BAT";
	char dst[64];
	char *str1 = "my soul";
	char *str2 = "my soul";
	char arr[20] = "I love ";
	char arr2[20] ="girl";
	char string1[30] = "I am a ";
	char string2[] = "student" ;
	int arr3[] = {1,2,3,4,5,6,7};
	int arr4[10] = {0};
	int arr5[10] = {1,2,3,4,5,6,7,8,9,0};
	int len = strlen(msg); 
	int my_len = strlen(arr); 	
	int my_int_len = sizeof(arr5)/sizeof(arr5[0]);
	char *ch = my_strcat(string1,string2);
	char *ret = my_strncat(arr,arr2,my_len);
	my_strcpy(dst,msg);
	printf("strcpy:  %s\n",dst);
	printf("strncpy: %s\n",my_strncpy(dst,msg,len));
	printf("strcmp:  %d\n",my_strcmp(str1,str2));
	printf("strncmp: %d\n",my_strncmp(str1,str2,len));
	printf("strncat: %s\n",ret);
	printf("strcat:  %s\n",ch);
	my_memcpy(arr4,arr3,sizeof(arr3));
	show(arr4,my_int_len);
	my_memmove(arr5+5,arr3+4,3*sizeof(int));
	show_move(arr5,arr4,3*sizeof(int));
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41035588/article/details/83308555