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;
}
}
7条答案
按热度按时间ddrv8njm1#
std::ostringstream
示例:
输出:
kcrjzv8t2#
更新,2019年8月:
看起来C++20将有
std::format
。参考实现是{fmt}。如果你现在正在寻找printf()
的替代品,这将成为新的"标准"方法,值得考虑。原件:
使用Boost.Format,它有类似
printf
的语法,类型安全,std::string
结果,还有很多其他漂亮的东西,你不会回头的。tez616oj3#
sprintf在C++中运行良好。
z18hc3ub4#
这是一个很好的c++ sprintf函数,如果你用的太多,流会变得很难看。
在C++11及更高版本中,std::string保证使用以
'\0'
结尾的连续存储,因此使用&str[0]
将其强制转换为char *
是法律的的。w8ntj3qf5#
您可以使用iomanip头文件来格式化输出流。检查this!
xfb7svmp6#
根据您对
sprintf()
ing的具体计划,std::to_string()
可能比其他选项更有用,也更符合习惯用法:恕我直言,
std::to_string()
的主要优点是它可以很容易地进行扩展,以支持sprintf()
甚至做梦也想不到的其他类型--有点像Java的Object.toString()
方法。5lhxktic7#
使用stringstream可以达到同样的效果,也可以包含
<cstdio>
,但仍然使用snprintf。