我应该使用CString :: Format还是sprintf_s

时间:2016-08-29 14:05:54

标签: string format printf c-strings

我有2个像这样的代码

代码1:CString :: Format方法

CString cStr;
char* ToString(CString pszFormat, ...)
{
    va_list argList;
    va_start(argList, pszFormat);
    cStr.FormatV(_T(pszFormat), argList);
    va_end(argList);
    return (LPTSTR)(LPCTSTR)cStr;
    //Note that this will return the pointer to the cstring content
}

代码2:sprintf_s方法

char strChar[100];
char* ToString(char const* const _Format, ...)
{
    va_list argList;
    va_start(argList, _Format);
    vsprintf_s(strChar, _Format, argList);
    va_end(argList);
    return strChar;
    //Note that this will return the pointer to the string content
}

在代码1中,我觉得完全安全 - 我不必担心长度可能太长。但我担心代码1可能会降低性能。我不知道它是否会导致内存泄漏。而且我认为如果Cstring具有动态长度,也许它会分配和释放内存,就像没有人一样。

所以我提出了代码2.但是在代码2中,如果我将_Format传递太长时间 - 就像长度为1000的字符串一样 - 我将面临风险 - 那么程序会因为'缓冲区太小而崩溃&# 39;错误。

我不知道哪一个更好:CString :: Format或sprintf_s ???如果sprintf_s确实提高了性能并且CString :: Format对性能不利,那么我会花更多的精力来防止缓冲太小'在sprintf_s中。但是如果sprintf_s不值得 - 我会采取CString :: Format。

感谢阅读。

1 个答案:

答案 0 :(得分:0)

如果您担心 strChar 中的缓冲区可能会溢出,那么为什么不简单地使用 vsnprintf_s()。第二个参数将限制写入输出缓冲区的字符数。您可以修改自己的ToString()'函数接收这个额外的sizeOfBuffer字段并将其传递给 vsnprintf_s()

有关防止缓冲区溢出的详细信息和其他方法,请参阅[https://msdn.microsoft.com/en-us/library/d3xd30zz.aspx][1]