在 windows 平台上,MS对一些字符串操作函数做了安全化,比如 strcpy_s,strcat_s,sprintf_s 等,使用它们避免了警告,却失去了可移植性。
前两个函数很简单,可以自己写,后一个带变长参数的比较复杂,自己写容易考虑不周,故定义为宏比较合适。
int SafeCopyStr(char* pszDst, int nDstSize, const char* pcszSrc)
{
if (!pszDst || !pcszSrc || nDstSize <= 0)
return -1;
int i = 0;
while (pcszSrc[i])
{
if (i >= nDstSize)
break;
pszDst[i] = pcszSrc[i];
i++;
}
int nCopyedSrcLen = i;
if (i >= nDstSize)
nCopyedSrcLen = nDstSize - 1;
pszDst[nCopyedSrcLen] = '\0';
return nCopyedSrcLen;
}
int SafeCatStr(char* pszDst, int nDstSize, const char* pcszSrc)
{
if (!pszDst || !pcszSrc || nDstSize <= 0)
return -1;
int nDstLen = (int)strlen(pszDst);
int nDstRemainderSize = nDstSize - nDstLen;
if (nDstRemainderSize < 1)
return -1;
//这里不可能返回-1的。
int nCopyedSrcLen = SafeCopyStr(&pszDst[nDstLen], nDstRemainderSize, pcszSrc);
return nCopyedSrcLen + nDstLen;
}
#ifdef WIN32
#define SafeFormatStr(buffer, buffersize, format, ...) sprintf_s(buffer, buffersize, format, ##__VA_ARGS__)
#else
#define SafeFormatStr(buffer, buffersize, format, ...) sprintf(buffer, format, ##__VA_ARGS__)
#endif