为什么不用临时矩阵是错误的呢?因为输入地址是重叠的,上面这段程序重写了起始字符引起数据丢失 。使用临时矩阵就是为了处理当目的地址和原地址是重叠的情况!
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 1
void 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];
}
#else
void 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;
}
#endif
int 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