int MyStrlen(const char * pStr)
{
int iCount = 0;
while (*(pStr+iCount) != '\0')
{
iCount = iCount + 1;
}
return iCount;
}
void * MyStrcpy(char * const pDest,const char * pSrc)
{
char *pDestTemp = pDest;
int iLoop = 0;
int iLength = 0;
if (NULL == pDest || NULL == pSrc)
{
return pDest;
}
iLength = MyStrlen(pSrc);
/*
判断是用于处理源字符串和目标字符串是同一个字符串的情况
*/
if (pDest<=pSrc || pDest >= pSrc + iLength)
{
for(iLoop=0;iLoop<=iLength;iLoop++)
{
*(pDestTemp+iLoop) = *(pSrc+iLoop);
}
}
else
{
pDestTemp = pDestTemp + iLength;
pSrc = pSrc + iLength;
while (iLength >= 0)
{
*(pDestTemp--) = *(pSrc--);
iLength = iLength - 1;
}
}
return pDest;
}
输入的第一个参数是用于返回拷贝后的字符串的,所以字符串指针地址不能变;
第二个参数,是源字符串,所以不能更改值。
MyStrcpy(strSrc+3,strSrc);
MyStrcpy(strSrc,strSrc+3);
逻辑判断就是为了处理上面这两种调用。
可实际系统的strcpy函数,对这种调用处理结果是很不确定的。
这是Ubuntu下执行的结果;
这是Windows下Visual Studio 2008执行的效果。
执行的函数都是MyStrcpy(strSrc+3,strSrc);
让人很是不解。