在将参数传递给字符串时将字符串写入char

时间:2017-08-23 12:01:36

标签: c++ string

我有以下代码:

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传递时它不起作用。

2 个答案:

答案 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