如果%s设置为整数,则为vsnprintf崩溃程序

时间:2013-08-08 14:31:17

标签: c++ printf

我正在用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确实有抛出,所以它崩溃了。 试图从vsnprintf获取返回值,它返回值,而字符串很好,当达到相同的问题时,它崩溃

我能解决这个问题吗?

感谢

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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