vsnprintf程序在%s设置为整数的情况下崩溃

vsnprintf crash program in case %s is set with an integer

本文关键字:整数 情况下 崩溃 设置 程序 vsnprintf      更新时间:2023-10-16

我正在用C++编写一个记录器,为了简化输入行,我使用vsnprintf函数来构建日志行

void CLogger::RegManLog(const LogLevel & logLevelMask, char * Format, ...)
...
...
va_start(marker_, Format);
vsnprintf(buffer_ ,MaxLogBuffSize , Format, marker_)
va_end(marker_);
printer_ += buffer_;
...
...

每件事都很好,直到我不小心在字符串中输入了一个数字

整数检验=10;例如:"现在我将显示字符串%s",测试

尝试添加"try-and-catch",但我认为vsnprintf确实有throw,所以它无论如何都会崩溃。试图从vsnprintf获取返回值,它返回值,而字符串很好,当达到相同的问题时,它会崩溃

我能解决这个问题吗?

感谢

  1. %s期望得到一个char*。当你通过10时,它会把它当作一个地址,然后去那里并终止你的程序
  2. 如果要打印整数,请使用%d。有关更多信息,请查看http://pubs.opengroup.org/onlinepubs/009695399/functions/printf.html
  3. 在C++中,最好使用其他方法来完成您需要的内容,如std::stringstream

您可以避免使用printf和friends,而是使用std::stringstreamboost::format

好吧,当传递给printf()和家族时,%s格式化程序在这里作为-最终const-char *指针的占位符。

发生的情况是,您的整数被读取为指针,并且内存地址(在您的示例中为10)可能无效。

相关文章: