我知道
那么,C++ 中的
std::cout
是 C++ 中的 printf
等价物。那么,C++ 中的
sprintf
等价于什么?示例:
#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
2019年8月更新:
看起来C++20将会有std::format
。 参考实现是{fmt}。 如果你现在正在寻找printf()
的替代方案,那么这将成为新的“标准”方法,并值得考虑。
原始内容:
使用Boost.Format。它具有类似于printf
的语法,类型安全性,std::string
结果和许多其他巧妙的功能。您将不会后悔选用。
sprintf在C++中表现良好。
这是一个不错的 C++ sprintf 函数。如果过度使用流,它们可能会变得难看。
std::string string_format(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'
结尾的连续存储空间,因此可以使用&str[0]
将其转换为char *
。(char*) str.c_str()
强制转换去掉了const
。 - MSalters根据你计划使用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");
}
< p > 我认为 < code > std::to_string() 的主要优点是它可以轻松扩展以支持其他类型,而 < code > sprintf() 甚至无法将其转换为字符串 - 类似于 Java 的 < code > Object.toString() 方法。 < / p >
使用stringstream可以实现相同的效果。此外,您还可以包含<cstdio>
并仍然使用snprintf。
sprintf(...)
有一点相似之处?你不能随意格式化数据,必须依靠在使用<<
操作符把数据输入流时已知的数据类型。 - Andon M. Coleman