我有以下代码:
char szBuf[256] = "";
std::string szFmt = "You have recieved %s item."
string szName = "Fork";
snprintf(szBuf, sizeof(szBuf), szFmt.c_str(), szName);
我正在尝试将szFmt与szBuf组合在一起,同时将szFmt与szName结合起来。但是,当我在win10中执行此代码时,我得到了如此奇怪的输出:
你收到了Léý项目。
当我尝试在OSX El Capitan中执行代码时,我收到以下错误
不能传递非平凡类型'string'throgh可变参数函数的对象; 呼叫将在运行时
那么问题是什么,我该如何解决?
注意:我检查了this个问题,但在答案中,他们直接传递“Fork”,这也适用于我;但是当我将它作为szName传递时它不起作用。
答案 0 :(得分:5)
评论中提到了更好的解决方案(ostringstream
),但为了进一步提升教育价值,我将在这里解决当前的问题。
Varargs(printf
函数族可以接受可变数量的参数的机制)不像其他函数那样严格类型检查。在这种情况下,snprintf
期望字符串char*
,但您传递szName
string
对象。所以你也需要打电话给.c_str()
:
snprintf(szBuf, sizeof(szBuf), szFmt.c_str(), szName.c_str());
答案 1 :(得分:1)
使用std::ostringstream
将简化一些事情,特别是因为它比从C继承的printf
函数更安全,但也因为它可以处理所有标准类型并且正确地重载输出运算符{ {1}}您也可以非常轻松地将它用于自定义类。
使用<<
要记住的重要一点是,它是一个普通的输出流,就像std::ostringstream
一样,如果你可以使用std::cout
,那么你也可以使用std::cout
(或任何其他标准输出流)。
现在如何使用它:
std::ostringstream
就是这样。
要访问字符串,请使用str
函数:
std::ostringstream ostr; // Define the stream object
ostr << "You have recieved " << szName << " item.";
如果您因某种原因想将其复制到std::cout << "The output is " << ostr.str() << '\n';
缓冲区中:
char