我有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。
感谢阅读。
答案 0 :(得分:0)
如果您担心 strChar 中的缓冲区可能会溢出,那么为什么不简单地使用 vsnprintf_s()。第二个参数将限制写入输出缓冲区的字符数。您可以修改自己的ToString()'函数接收这个额外的sizeOfBuffer字段并将其传递给 vsnprintf_s()。
有关防止缓冲区溢出的详细信息和其他方法,请参阅[https://msdn.microsoft.com/en-us/library/d3xd30zz.aspx][1]。