<C/C++基础>深入认识strcpy和memcpy
来源:互联网 发布:淘宝客服名 编辑:程序博客网 时间:2024/06/14 01:37
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
两个函数的原型分别为:
char * strcpy(char * dst, const char * src) // 实现src到dest的复制{ if ((src == NULL) || (dst == NULL)) //判断参数src和dest的有效性 {return NULL; } char *strdest = dst; //保存目标字符串的首地址 char *strStr =(char *)src;//这里需要强制转换一下 while ((*strdest++=*strStr++)!='\0'); //把src字符串的内容复制到dest下 return strdest;}
void *memcpy(void * restrict dst, const void *restrict scr, size_t n){ if((dst == NULL) || (scr == NULL)) //scr和dst必须有效 return NULL; char *tempscr = (char *)scr; //保存scr首地址 char *tempdst = (char *)dst; //保存dst首地址 while( n -- > 0) //循环n次,复制scr的值到dst中 *tempdst++ = *tempscr++ ; return dst;}
写一个自己的memcpy:
// ConsoleAppMemcpy.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<string.h>#include "iostream"using namespace std;void myMemcpy(void *dst, void *src, size_t n){if ((src == NULL) || (dst == NULL)) //判断参数src和dest的有效性{cout<<"出现错误,可能是欲复制的内容为空";}// 将src和dst转换成 (char *)型char *csrc = (char *)src;char *cdst = (char *)dst;char *temp = new char[n];for (int i=0; i<n; i++)temp[i] = csrc[i];for (int i=0; i<n; i++)cdst[i] = temp[i];delete[] temp;}int main(){char csrc[] = "EbowTang";char cdest[100];myMemcpy(cdest, csrc, strlen(csrc)+1);cout<<"Copied string is "<<cdest<<endl;int isrc[] = {10, 20, 30, 40, 50};int n=sizeof(isrc)/sizeof(isrc[0]);int idest[5];myMemcpy(idest, isrc, sizeof(isrc));cout<<"Copied int array is ";for (int i=0; i<n; i++)cout<<idest[i]<<" ";getchar();return 0;}
写一个自己的strcpy:
#include "iostream"using namespace std;void MyStrcpy(char * dst, const char * src) // 实现src到dest的复制{if ((src == NULL) || (dst == NULL)) //判断参数src和dest的有效性{cout<<"出现错误,可能是欲复制的内容为空";}int n=sizeof(src)/sizeof(src[0]);char *temp = new char[n];for (int i=0; i<n; i++)temp[i] = src[i];for (int i=0; i<n; i++)dst[i] = temp[i];delete[] temp;}int _tmain(int argc, _TCHAR* argv[]){char dest[10]={0};const char src[6] = { 'a', 'b','c' ,'d' ,'e' };MyStrcpy(dest,src);puts(src);getchar();return 0;}
上面的两个短小程序用到了临时矩阵,为什么呢?见下面一段程序:
#include<stdio.h>#include<string.h>#if 1void myMemcpy(void *dest, void *src, size_t n){// 将src和dst转换成 (char *)型char *csrc = (char *)src;char *cdest = (char *)dest;// 没有用临时矩阵(错误的方式)for (int i=0; i<n; i++)cdest[i] = csrc[i];}#elsevoid myMemcpy(void *dst, void *src, size_t n){// 将src和dst转换成 (char *)型char *csrc = (char *)src;char *cdst = (char *)dst;char *temp = new char[n];for (int i=0; i<n; i++)temp[i] = csrc[i];for (int i=0; i<n; i++)cdst[i] = temp[i];delete[] temp;}#endifint main(){char csrc[100] = "EbowTang";myMemcpy(csrc+5, csrc, strlen(csrc)+1);//这句话的本意是想将EbowTang这个字符串复制到“EbowT”之后,形成新的字符串输出“EbowTEbwoTang”printf("%s", csrc);getchar();return 0;}
#if 0的结果(正确的)
为什么不用临时矩阵是错误的呢?因为输入地址是重叠的,上面这段程序重写了起始字符引起数据丢失 。使用临时矩阵就是为了处理当目的地址和原地址是重叠的情况!
参考资源:
【1】关于void 及其void指针:http://blog.csdn.net/geekcome/article/details/6249151
【2】本文参考自:http://zh.wikipedia.org/wiki/String.h#.E5.87.BD.E6.95.B0
1 0
- <C/C++基础>深入认识strcpy和memcpy
- c语言strcpy和memcpy
- C++:memset ,memcpy 和strcpy 的区别
- c中memcpy和strcpy区别
- C语言中strcpy和memcpy
- C语言实现strcpy和memcpy
- C语言memset、memcpy、memmove和strcpy
- 【基础C&C++】内存拷贝strcpy,memcpy,memmove,strncpy源码
- C基础:strcat,strcmp,memcpy,strcpy等函数的实现
- C语言基础-strdup/strcpy/strncpy/memcpy函数的使用
- C/C++基础面试集锦(一)strcpy、memcpy
- C strcpy & memcpy & malloc & free
- c memcpy 与 strcpy 区别
- C的memcpy,memmove和strcpy的区别是什么?
- C++:memset ,memcpy 和strcpy 的根本区别
- C语言中memset ,memcpy 和strcpy 的区别
- C++:memset ,memcpy 和strcpy 的根本区别(转)
- C++:memset ,memcpy 和strcpy 的根本区别?
- 工作流——顺序工作流和状态机工作流
- 路由器lan和wan的解释和网线插入
- 关于dp优化的问题
- 两个不同版本的Jquery冲突问题
- Codeforces Round #288 (Div. 2) C. Anya and Ghosts
- <C/C++基础>深入认识strcpy和memcpy
- listview优化几种写法
- amazon ec2 pem 丢失
- 不能将参数 1 从“CString”转换为“const char *
- 【SzNOI语法百题】【d007】 求两数的整数商 和 余数
- CODEVS 1012 最大公约数和最小公倍数问题
- ACM-数塔
- 02-3. 求前缀表达式的值(25)
- Caused by: android.view.InflateException: Binary XML file line #57: Error inflating class null