“解剖”复制类函数

一、strcpy()函数:

函数原型:char * strcpy(char * str1,char * str2)

函数功能:将str2指向的字符串复制到str1中去

返回值:返回str1

包含文件:string.h

注意:strcpy()根据\0作为判断结束,如果参数 str1 所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,使用strncpy()或许更加安全。

strcpy()源代码如下:

方法一:

int main()
{
char str2[10] = "hello";
char str1[10];
    int i = 0;
for( ; str2[i] != '\0';++i)
{
str1[i] = str2[i];
}
str1[i] = '\0';
printf("%s \n",str1);
}

方法二:借助下标

void my_strcpy(char *str1,char *str2)
{
int i=0;
if(str2 == NULL ||NULL == str1) return ;
while(str2[i] != '\0')
{
str1[i] = str2[i];
i++;
}
str1[i] = '\0';
}
void main()
{
   char str1[10];
   char str2[10] = "hello";
   my_strcpy(str1,str2);
   printf("%s  \n",str1);

}

运行结果:

扫描二维码关注公众号,回复: 3067941 查看本文章

方法三:不借助外力

void my_strcpy(char *str1,char *str2)
{
if(str2 == NULL || NULL == str1) return ;
while(*str2 != '\0')
{
*str1++ = *str2++;
}
*str1 = '\0';
}
void main()
{
   char str1[10];
   char str2[10] = "hello";
   my_strcpy(str1,str2);
   printf("%s  \n",str1);
}

运行结果如上。

方法四:改进方法二

void my_strcpy(char *str1,char *str2)
{
if(str2 == NULL || NULL == str1) return ;
while(*str1++ = *str2++);

}

二、memcpy()函数

与strcpy()函数的区别:

strcpy()总是与字符串是相对应的,该函数复制的内容为字符串,然而字符串在复制的时候通常使用该函数。该函数遇到字符串的结束符\0即结束,容易导致溢出。

memcpy()可以复制任意的内容,比如:结构体、字符数组、整型等,使用的对象类型广泛,然而,除了字符串以外的其他函数在复制时通常使用该函数,然而,其复制的长度根据第三个参数来决定。

函数原型:void *memncpy(void *di,void *si,int n)

memcpy()源代码如下:

方法一:

int main()
{
char s[] = {"hello"};
char p[10];
int size = sizeof(s);
    int i = 0;
for( ;i < size;++i)
{
p[i] = s[i];
}
p[i] = '\0';
printf("%s \n",p);

}

方法二:

void *my_memcpy(void *di,void *si,int size)
{
    if(di == NULL||si == NULL||size < 1)  return NULL;
char *s = (char *)di;
const char *p = (const char *)si;
int i = 0;
for( ;i < size;++i)
{
s[i] = p[i];
}
return di;
}
void main()
{
char buff[10] = {"hello"};
char ar[10];
my_memcpy(ar,buff,sizeof(buff));
printf("%s \n",ar);

}

方法三:

void *my_memcpy(void *di,void *si,int size)
{
    if(di == NULL||si == NULL||size < 1)  return NULL;
char *s = (char *)di;
const char *p = (const char *)si;
while(p[size])
{ *s++ = *p++;}
return di;
}
void main()
{
char buff[10] = {"hello"};
char ar[10];
my_memcpy(ar,buff,sizeof(buff));
printf("%s \n",ar);
}

三、strncpy()函数

函数功能:复制字符串,但是不限制复制的数量,可以选择一段字符进行复制输出。

函数原型:char *strncpy(char *di,char *si,size_t n).

这里注意:

如果*si的字符串长度<=*di的字符串长度,如果n>*si由于长度达到si NUL,正常复制,但是,如果si中有NULL,strncpy复制到NULL即使没到n也提前停止。如果n = *si串长度,与strcpy一致。注意n的选择当n > *di串长度,di栈空间溢出产生崩溃异常。

如果*si串长度>*di串长度若n =*di串长度,则*di串没有NULL字符,会导致输出会有乱码。如果不考虑*si串复制完整性,可以将*di 最后一字符置为NULL。

因此,一般情况下,使用strncpy时,建议将n置为*di串长度

strncpy()函数源代码如下:

方法一:

void main()
{
char s[] = "hello";
char p[10];
int  n = 3;
int  i = 0;
for( ; i < n;++i)
{
p[i] = s[i];
}
p[i] = '\0';
printf("%s \n",p);

}

方法二:使用下标

char *strncpy(char *di,char *si,int n)
{
   if(si == NULL||di == NULL||n < 1)  return NULL;
   int i = 0;
   for(;i < n;++i)
   {
  di[i] = si[i];
   }
   di[i] = '\0';
   return di;
}
void main()
{
char s[] = "hello";
char d[10];
int  n = 3;
strncpy(d,s,n);
printf("%s \n",d);

}

剩下的不使用下标,或者使用指针进行加减,等同前两个复制函数相似,这里不再给出详细的代码。

   我是编程小白一只,初次涉猎编程,麻烦读者多多指正不足之处。






猜你喜欢

转载自blog.csdn.net/qq_40303781/article/details/80258772