1

我正在用 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 获取返回值,它返回值,而字符串很好,当遇到相同的问题时,它会崩溃

我有什么想法可以解决这个问题吗?

谢谢

4

3 回答 3

3
  1. %s 期望得到一个 char*。当你传入 10 时,它会将其视为一个地址,然后去那里杀死你的程序。
  2. 如果要打印整数,请使用 %d。有关更多信息,请查看http://pubs.opengroup.org/onlinepubs/009695399/functions/printf.html
  3. 在 C++ 中,最好使用其他方法来完成您需要的操作,例如 std::stringstream
于 2013-08-08T14:37:38.797 回答
1

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

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

于 2013-08-08T14:36:00.867 回答
1

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

于 2013-08-08T14:33:29.493 回答