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

我应该使用CString::Format还是sprintf_s,string,format,printf,c-strings,String,Format,Printf,C Strings,我有两个这样的代码 代码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

我有两个这样的代码

代码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_方法

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中,如果我传递的_格式太长,比如长度为1000的字符串,那么程序就会因“缓冲区太小”错误而崩溃

我不知道哪一个更好:CString::Format还是sprintf_\s???如果sprintf_真的提高了性能,而CString::Format对性能不利,那么我将采取更多措施来防止sprintf_中的“缓冲区太小”。但是如果sprintf_不值得,我将选择CString::Format


感谢阅读。

如果您担心strChar中的缓冲区可能溢出,那么为什么不直接使用vsnprintf_s()。第二个参数将限制写入输出缓冲区的字符数。您可以修改“ToString()”函数以接收此额外的sizeOfBuffer字段,并将其传递到vsnprintf\u s()


看[有关防止缓冲区溢出的详细信息和其他方法。

但我的问题是CString::Format与sprintf_s的优缺点。您完全忽略CString::Format这两种实现都是完全伪造的。第一种实现返回指向不可变对象内部的非常量指针。如果您对此感到安全,您需要阅读来自的书很少。第二本会损坏内存。因为您关心性能,而不关心正确性,所以很容易优化任何一个实现以不花费任何时间。此外,如果您无法测量性能,您也不应该关心。@I不可预知的感谢您的建议。