我知道这std::cout
与的C ++等效printf
。
C ++等于sprintf
什么?
Answers:
例:
#include <iostream>
#include <sstream> // for ostringstream
#include <string>
int main()
{
std::string name = "nemo";
int age = 1000;
std::ostringstream out;
out << "name: " << name << ", age: " << age;
std::cout << out.str() << '\n';
return 0;
}
输出:
name: nemo, age: 1000
sprintf (...)
到底有何相似之处?您不能任意格式化数据,使用<<
操作符将其输入流中时,必须依靠已知的类型。
2019年8月更新:
看起来C ++ 20将会有std::format
。参考实现是{fmt}。如果您现在正在寻找printf()
替代方法,那么它将成为新的“标准”方法,值得考虑。
原版的:
使用Boost.Format。它具有printf
类似语法,类型安全性,std::string
结果以及许多其他漂亮的东西。你不会回去的。
sprintf在C ++中可以正常工作。
这是C ++ sprintf的一个不错的功能。如果使用过多,流可能会变得很丑陋。
std::string string_format(const std::string &fmt, ...) {
int size=100;
std::string str;
va_list ap;
while (1) {
str.resize(size);
va_start(ap, fmt);
int n = vsnprintf(&str[0], size, fmt.c_str(), ap);
va_end(ap);
if (n > -1 && n < size) {
str.resize(n); // Make sure there are no trailing zero char
return str;
}
if (n > -1)
size = n + 1;
else
size *= 2;
}
}
在C ++ 11和更高版本中,保证std :: string使用以结尾的连续存储'\0'
,因此将其强制转换为char *
using是合法的&str[0]
。
已经指出,可变参数不应该遵循按引用传递,并且c ++很好地在不需要时不复制字符串。在这种情况下,可以解决此问题。
std::string string_format(std::string fmt, ...) {
sprintf
-usage。
(char*) str.c_str()
抛弃const
。
与其他选择相比sprintf()
,这std::to_string()
可能更有用,而且视具体情况而定,具体取决于您计划的内容:
void say(const std::string& message) {
// ...
}
int main() {
say(std::to_string(5));
say("Which is to say " + std::to_string(5) + " words");
}
std::to_string()
恕我直言,它的主要优点是可以轻松扩展以支持sprintf()
甚至无法梦想字符串化的其他类型-类似于Java的Object.toString()
方法。