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