首页 > 其他分享 >strcpy、strncpy与memcpy的区别你了解吗?

strcpy、strncpy与memcpy的区别你了解吗?

时间:2023-07-10 23:07:18浏览次数:45  
标签:src dest source strcpy memcpy strncpy

一、定义

1.memcpy函数

void *memcpy(void *destin, void *source, unsigned n);

作用:函数memcpy从source指向的对象中复制n个字符到destin指向的对象中 返回值:函数memcpy返回destin的指针。

2.strcpy函数

char strcpy(char dest, const char *src);

作用:函数strcpy把src指向的串(包括空字符)复制到dest指向的数组中,src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回值:函数strcpy返回dest的指针。

3.strncpy函数

char *strncpy(char *destinin, char *source, int maxlen);

作用:复制字符串source中的内容(字符,数字、汉字….)到字符串destinin中,复制多少由maxlen的值决定。source和destinin所指内存区域不可以重叠且destinin必须有足够的空间来容纳source的字符长度+‘\0’。 返回值:函数strncpy返回destinin的值。

二、区别

1、strcpy 是依据 “\0” 作为结束判断的,如果 dest 的空间不够,则会引起 buffer overflow。 2、memcpy用来在内存中复制数据,由于字符串是以"\0"结尾的,所以对于在数据中包含"\0"的数据只能用memcpy。(通常非字符串的数据比如结构体都会用memcpy来实现数据拷贝) 3、strncpy和memcpy很相似,只不过它在一个终止的空字符处停止。当n>strlen(src)时,给dest不够数的空间里填充"\0“;当n<=strlen(src)时,dest是没有结束符"\0“的。这里隐藏了一个事实,就是dest指向的内存一定会被写n个字符。 4、strcpy只是复制字符串,但不限制复制的数量,很容易造成缓冲溢出。strncpy要安全一些。strncpy能够选择一段字符输出,strcpy则不能。

三、总结

1、dest指向的空间要足够拷贝;使用strcpy时,dest指向的空间要大于等于src指向的空间;使用strncpy或memcpy时,dest指向的空间要大于或等于n。 2、使用strncpy或memcpy时,n应该大于strlen(s1),或者说最好n >= strlen(s1)+1;这个1 就是最后的“\0”。 3、使用strncpy时,确保s2的最后一个字符是"\0”。

标签:src,dest,source,strcpy,memcpy,strncpy
From: https://blog.51cto.com/lxc2046/6681049

相关文章

  • C语言的strcpy()函数
    strcpy()函数的简介strcpy()函数用于将一个字符串拷贝到另一个内存地址的函数,拷贝停止的条件是遇到'\0',同时会将'\0'一同拷贝到目标地址。下面是strcpy()函数的声明:char*strcpy(char*destination,constchar*source);1.函数的参数:char*destination---------目标字......
  • C++面试八股文:如何实现一个strncpy函数?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第31面:面试官:strcpy函数使用过吧?二师兄:用过。面试官:这个函数有什么作用?二师兄:主要用做字符串复制,将于字符从一个位置复制到另一个位置。面试官:strncpy函数也使用过吧,和strcpy有何不同?二师兄:strncpy多了一个size_t的参数,用于避......
  • assert断言与const修饰指针的妙用(模拟实现strcpy函数)
     assert断言目录assert断言的妙用:头文件:使用方法:const修饰指针的妙用主要用法const在*左边const在*右边断言和const修饰指针的应用模拟实现C语言strcpy函数  1、若字符串str1,str2有空指针怎么办?  2.str2改变了怎么办?assert断言的妙用:头文件:#include<assert.h>使用方法:当......
  • 自己实现strcpy
    /*printfexample*/#include<stdio.h>char*my_strcpy(char*des,constchar*src){char*ret=des;while(*src!='\0'){*des++=*src++;}*des=*src;returnret;}intmain(){chardes[]="#####......
  • memcpy源码
    【调用栈】 【代码】 【glibc2.17和2.18性能的讨论】https://sourceware.org/bugzilla/show_bug.cgi?id=24872......
  • 实现memcpy()函数过程总结
    1.按字节实现1)初步版本void*my_memcpy(void*dst,constvoid*src,intn){if(dst==NULL&&src==NULL&&n<=0)returnNULL;char*s=(char*)src;char*d=(char*)dst;while(n--){*d++=*s++;}returnd......
  • strcpy函数
    strcpy函数#include<stdio.h>#include<string.h>#include<stdlib.h>char*mystrcpy(char*a,char*b){if(NULL==a||NULL==b){printf("参数错误\n");exit(-1);}char*p=a;while(*p++=*b++);returna;}intmain(......
  • 函数strncpy和memcpy的区别
    1定义1.1memcpyvoid*memcpy(void*destin,void*source,unsignedn);参数*destin----需要粘贴的新数据(地址)*source----要拷贝的数据(地址)unsignedn----拷贝数据的字节数1.2strncpchar*strncpy(char*destinin,c......
  • strcpy一例
    完整复制字符串的一个简单程序1#include<stdio.h>2#include<stdlib.h>3#include<string.h>45char*strcpy(char*dst,constchar*src){6char*s=dst;78while((*dst++=*src++)!='\0')/*dstwillcontain'......
  • 如何理解strcpy函数中的赋值语句?
    关于strcpy函数的赋值语句如何理解while(*s++=*t++)?voidstrcpy(char*s,char*t){while(*s++=*t++);}该语句等价于while(*(s++)=*(t++))。赋值......