strcpy、strncpy与memcpy的区别与使用方法

今天做题用到了这两个函数,不是很懂,学习了下~

转自http://www.cnblogs.com/houjun/p/4913216.html

本文参考《C 标准库》编写。

一、函数说明

1、memcpy函数

void  *memcpy(void *s1,  const void *s2,  size_t  n);

说明:

函数memcpy从s2指向的对象中复制n个字符到s1指向的对象中。如果复制发生在两个重叠的对象中,则这种行为未定义。

返回值:

函数memcpy返回s1的值。

2、strcpy函数

char  *strcpy(char *s2, const char *s1);

说明:

函数strcpy把s1指向的串(包括空字符)复制到s2指向的数组中。如果复制发生在两个重叠的对象中,则这种行为未定义。

返回值:

函数strcpy返回s2的值。

3、strncpy函数

char  *strncpy(char *s2, const char *s1, size_t n);

说明:

函数strncpy从s1指向的数组中最多复制n个字符(不复制空字符后面的字符)到s2指向的数组中。如果复制发生在两个重叠的对象中,则这种行为未定义。

如果s1指向的数组是一个比n短的字符串,则在s2定义的数组后面补空字符,直到写入了n个字符。

返回值:

函数strncpy返回s2的值。

二、注意事项

strcpy 是依据 “\0” 作为结束判断的,如果 s2 的空间不够,则会引起 buffer overflow。

memcpy用来在内存中复制数据,由于字符串是以“\0”结尾的,所以对于在数据中包含“\0”的数据只能用memcpy,如:"hell\0oworld"。

Strncpy和memcpy很相似,只不过它在一个终止的空字符处停止。当n>strlen(s1)时,给s2不够数的空间里填充“\0”;当n<=strlen(s1)时,s2是没有结束符“\0”的。

这里隐藏了一个事实,就是s2指向的内存一定会被写n个字符。

所以总的来说注意:

1、s2指向的空间要足够拷贝;使用strcpy时,s2指向的空间要大于等于s1指向的空间;使用strncpy或memcpy时,s2指向的空间要大于或等于n。

2、使用strncpy或memcpy时,n应该大于strlen(s1),或者说最好n >= strlen(s1)+1;这个1 就是最后的“\0”。

3、使用strncpy时,确保s2的最后一个字符是“\0”。

 1 /*************************************************************************
 2     > File Name: a.cpp
 3     > Author: yijiull
 4     > Mail: [email protected]
 5     > Created Time: 2017年09月18日 星期一 17时22分46秒
 6  ************************************************************************/
 7
 8 #include <iostream>
 9 #include <cstring>
10 using namespace std;
11
12   int main()
13   {
14
15           char str[4] = { ‘w‘, ‘x‘, ‘y‘, ‘z‘};
16           char *p = "a\0bcdefg";
17           strncpy(str, p, sizeof(str) - 1);
18
19           cout << (str[0]) << endl; // ‘a‘
20           cout << (str[1]) << endl; // ‘\0‘
21           cout << (str[2]) << endl; // ‘\0‘   //确实要注意这个值, 不是‘b‘
22
23           cout << (str[3]) << endl; // ‘z‘
24
25           return 0;
26   }
27
28   
时间: 2024-12-22 20:35:31

strcpy、strncpy与memcpy的区别与使用方法的相关文章

[VC]strcpy memcpy memset区别与简介

strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NULL结束的字符串复制到dest所指的数组中. 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串.       返回指向dest的指针.memcpy 原型:extern void *memcpy(void *dest, void *src, unsigned int count);

sprintf、strcpy和memcpy的区别

做某题用到了sprintf把一个字符数组(字符串)写到二维字符数组里,然后耗时挺长的,想了想strcpy好像也可以,事实证明strcpy效率果然更高,然后想了想觉得memcpy好像也可以.实践了一下的确可以,效率不用说也比sprintf高,毕竟memcpy是对内存操作.然后我就百度了一下它们的区别,做个总结(记笔记). sprintf 可以用%s来实现格式化写入,其他两个做不到. strcpy 遇到\0结束(\0也被复制了),只能拷贝字符串. memcpy 根据size大小来复制,可以复制各种数

实现strcpy函数、memcpy函数

需要注意的是:第44.45行中,strlen是函数,sizeof是算符. strlen()是从内存的某个位置开始扫描,知道碰到第一个字符串结束符'\0'为止,然后返回计数器数值(不包括'\0'). sizeof是一个操作符,简单地说,就是返回一个对象或者类型所占的内存字节数. strcpy和memcpy的区别: 1.复制的内容不同,strcpy只能复制字符串,而memcpy可以复制任意内容,例如,字符数组.类型.结构体.类等. 2.复制的方法不同,strcpy不需要指定长度,它遇到字符串结束符'

python socket编程入门(编写server实例)+send 与sendall的区别与使用方法

python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参数代表地址家族,可为AF_INET或AF_UNIX.AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信. type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字). 2. 第二步是将socket绑定到指定地址.这

心火肝火胃火肺火的症状区别及治疗方法

一.心火 心火的症状:失眠.心烦.焦虑(舌尖会比较红.长口疮),容易失眠 上火的原因:着急.劳心 降心火的方法:连子心茶.黄连阿胶汤.牛黄清心丸.导赤散 中医助眠药:中医没有治失眠的药物,它只是把导致失眠的原因祛除,所以这些药不会在失眠药里面出现,但是它们确实能够助眠. 天王补心丹:有口唇.舌尖都很红,失眠健忘.手脚出汗的症状,就适合吃天王补心丹.   朱砂安神丸:失眠多梦.心神不宁.坐立不安.精神抑郁     柏子养心丸:柏子养心丸,说到养,它里面有黄芪,所以柏子养心丸治失眠的同时,还适合那种

GET 和 POST的区别? 用POST方法发送登陆请求

GET 和 POST的区别? 用POST方法发送登陆请求. { <1> http方法: http协议定义了很多方法对应不同的资源操作,其中最常用的是GET 和 POST 方法. { { GET.POST.OPTIONS.HEAD.PUT.DELETE.TRACE.CONNECT.PATCH } 增:PUT 删:DELETE 改:POST 查:GET } <2> 参数 { 因为 GET 和 POST 可以实现上述所有操作,所以,在现实开发中,我们只要会用GET 和 POST 方法就可

GET方法和POST方法的区别,Get方法到底可传递的字符串的最大长度是多少?

GET方法和POST方法的区别,Get方法到底可传递的字符串的最大长度是多少?曾经人介绍,如果使用GET方式传输参数,URL的最大长度是256个字节,对此深信不疑. 但是最近看到一些超长的url,能够在IE下工作,复制下来测算了一下长度,大概是650个字节,这个长度远远超过了256个字节.这时候对以前的说法不由得有些怀疑—-用各大搜索引擎翻了个遍,最后找到最权威的解释—-Maximum URL length is 2,083 characters in Internet Explorer.———

memcpy strcpy strncpy的使用

strcpy和memcpy都是标准C库函数,它们有下面特点: 1.strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符. strcpy的函数原型是:char* strcpy(char* dest, const char* src); 注意几点: (1).操作的数据类型是char*,返回的也是char * (2).该函数会连同字符串的结束字符'/0'一起拷贝到字符数组中,故字符数组的长度应该至少是字符串的长度加1 (3).dest是存放

strcpy和memcpy的区别

strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制.即memcpy对于需要复制的内容没有限制,因此用途更广. char * strcpy(char * dest, const char * src) // 实现src到dest的复制 { if ((src == NULL) || (d