C/C++:关于sprintf的替换方案

原创
2015/04/23 17:38
阅读数 925

(环境:Win7 64位, C++ builder 2010)

C/C++中使用sprintf函数的频率非常高,可能是由于经常要将数据转换为字符串,同时也由于此函数使用非常简单方便。但是此函数极度危险,非常容易导致内存溢出错误,故应该禁止使用。

snprintf系列函数(可能是_snprintf,snprintf_s,或_snprintf_s),可以增加缓冲区长度来控制输入,可以作为一种替代方案。

另外也可以使用vsnprintf系列函数(可能是_vsnprintf,vsnprintf_s等)自己实现一种替代方案。示例代码如下:

int SafeSprintf(char *pszBuffer, int iBufferLen, char *pszFormat, ...)
{
    if ((pszBuffer == NULL) || (iBufferLen <= 0))
    {
        return -1;
    }
    
    *pszBuffer = '\0';
    
    va_list vaList;
    va_start(vaList, pszFormat);
    int iLen = vsnprintf(pszBuffer, iBufferLen, pszFormat, vaList);
    va_end(vaList);
    
    if (iLen >= iBufferLen) 
    {
        iLen = iBufferLen - 1;
        pszBuffer[iLen] = '\0';
    }

    return iLen;
}

int _tmain(int argc, _TCHAR* argv[])
{
    char szBuffer[4] = {0};

    SafeSprintf(szBuffer, 1, "%s", "12345");
    
    system("pause");

    return 0;
}
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部