// 字符数组拷贝
// VC 2008
#include "stdafx.h"
#include <assert.h>
// 字符串拷贝, 末尾用0填充
char* strcpy_len(char pDest[], WORD iDestLen, const char pSrc[], WORD iSrcLen)
{
if(pDest == 0 || iDestLen == 0)
{
return pDest;
}
if(pSrc == 0 || iSrcLen == 0)
{
// 填充0
memset(pDest, 0, iDestLen);
return pDest;
}
// 拷贝数据
WORD iCpyLen = min(iDestLen - 1, iSrcLen);
if(pDest != pSrc)
{
// 这里没有考虑pDest和pSrc部分重叠的情况
assert((pDest < pSrc && pDest + iCpyLen <= pSrc)
|| (pDest > pSrc && pDest >= pSrc + iCpyLen));
memcpy(pDest, pSrc, iCpyLen);
}
// 结尾的'/0'
pDest[iCpyLen] = 0;
// 填充字符串后面的所有空间
WORD iRealLen = strlen(pDest);
if(iRealLen < iDestLen - 1)
{
memset(pDest + iRealLen, 0, iDestLen - 1 - iRealLen);
}
return pDest;
}
int _tmain(int argc, _TCHAR* argv[])
{
char* src = "Hello!";
char dst[4];
char* pCpy = strcpy_len(dst, sizeof(dst), src, WORD(-1));
char dst2[20];
char* pCpy2 = strcpy_len(dst2, sizeof(dst2), src, WORD(-1));
return 0;
}