我知道std::cout
是printf
的C ++等价物。
sprintf
的C ++等价物是什么?
答案 0 :(得分:54)
示例:
#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
答案 1 :(得分:23)
使用Boost.Format。它具有printf
- 类似语法,类型安全,std::string
结果以及许多其他漂亮的东西。你不会回去。
答案 2 :(得分:16)
sprintf在C ++中运行得很好。
答案 3 :(得分:7)
您可以使用iomanip头文件格式化输出流。 检查this!
答案 4 :(得分:5)
这是c ++ sprintf的一个很好的功能。如果你使用它们太多,流可能会变得难看。
std::string string_format(const std::string &fmt, ...) {
int n, 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)
return str;
if (n > -1)
size = n + 1;
else
size *= 2;
}
}
在C ++ 11及更高版本中,std :: string保证使用以'\0'
结尾的连续存储,因此使用char *
将其强制转换为&str[0]
是合法的。
答案 5 :(得分:0)
使用stringstream来达到同样的效果。此外,您可以添加<cstdio>
并仍然使用snprintf。
答案 6 :(得分:0)
取决于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()
方法