C++中的strcpy没有考虑全面是我没有想到的:C++的strcpy无法解决内存覆盖的问题,比如:char str[100] = "hello"; strcpy(str + 1, str); 会出现意外的结果,请自己试一试。
既然C++不能解决内存覆盖的strcpy(但是memcpy确实能解决,我却不知道这是问什么了,难道他们认为strcpy不会去解决内存覆盖的情况么?),那么我们就自己写一个:
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <assert.h>
using namespace std;
/*
memcpy的实现方法
*/
void* memCpy(void* memDest, void* memSrc, unsigned int size)
{
assert(memDest != NULL && memSrc != NULL);
if (memDest < memSrc || (char*) memDest > (char*)memSrc + size) //判断内存是否出现重叠
{
while (size--)
{
*(char*)memDest = *(char*)memSrc;
memDest = (char*)memDest + 1;
memSrc = (char*)memSrc + 1;
}
}
else
{
memDest = (char*)memDest + size - 1;
memSrc = (char*)memSrc + size - 1;
while (size--)
{
*(char*)memDest = *(char*)memSrc;
memDest = (char*)memDest - 1;
memSrc = (char*)memSrc - 1;
}
}
}
unsigned strLen(char* str)
{
char* oldVal = str;
while (*str++ != '\0');
return str - oldVal - 1;
}
/*
这个才是真正正确的strCpy的实现方法
*/
char* strCpy(char* strDest, const char* strSrc)
{
assert(strDest != NULL && strSrc != NULL);
if (strDest == strSrc)
{
return strDest;
}
memCpy(static_cast<void*>(strDest), static_cast<void*>(const_cast<char*>(strSrc)), strLen(const_cast<char*>(strSrc)) + 1);
return strDest;
}
/* 这个实现跟系统实现的做法应该差不多,如果是在同一个字符串就执行不正确!
char* strCpy(char* strDest, const char* strSrc)
{
if (strSrc == NULL || strDest == NULL)
return NULL;
if (strDest == strSrc)
return strDest;
char* temp = strDest;
while ((*strDest++ = *strSrc++) != '\0');
return temp;
}
*/
int main()
{
char strDest[20]; //乱指的指针。很害人啊!
char strSrc[] = "hello";
strCpy(strSrc + 1, strSrc);
cout << strSrc << endl;
return 0;
}
好像不用memcpy那么麻烦,从后往前就可以避免了。
char* StrCpy2(char* strDest, char* strSrc)
{
assert(strDest != NULL && strSrc != NULL);
int len = strlen(strSrc);
cout << "len = " << len << endl;
char* endOfSrc = strSrc + len;
char* endOfDest = strDest + len;
len++;
while (len--)
{
(*endOfDest) = (*endOfSrc);
endOfDest--;
endOfSrc--;
}
return strDest;
}