构造std :: string时是否有一种快速简便的方法来获得类似sprintf的格式?有点像...
std::string foo("A number (%d) and a character (%c).\n", 18, 'a');
答案 0 :(得分:16)
没有内置到字符串的构造函数中,但您可能想要查看boost format。它是一种更加类型安全的sprintf样式字符串格式。有了它,你至少可以这样做:
std::string foo =
boost::str(boost::format("A number (%d) and a character (%c)\n") % 18 % 'a');
答案 1 :(得分:11)
我已经编写了一个stringbuilder
类,您可以使用它,我认为这比boost::format
更好,因为stringbuilder
不使用像{%d
这样的C风格格式字符串1}},%c
。等
以下是stringbuilder
只能在一行中为您提供帮助的方式:
std::string s=stringbuilder() << "A number " << 18 <<" and a character " <<'a';
stringbuilder
的实施非常简单:
struct stringbuilder
{
std::stringstream ss;
template<typename T>
stringbuilder & operator << (const T &data)
{
ss << data;
return *this;
}
operator std::string() { return ss.str(); }
};
在ideone演示:http://ideone.com/J9ALB
我刚刚撰写了以下博客,介绍了使用stringbuilder
的许多不同方式。
答案 2 :(得分:7)
fmt library提供了一个安全的sprintf
实现,它返回一个字符串:
std::string foo = fmt::sprintf("A number (%d) and a character (%c).\n", 18, 'a');
该库还支持Python的str.format
语法:
std::string foo = fmt::format("A number ({}) and a character ({}).\n", 18, 'a');
它的目的与Boost Format类似,但是much faster,非常小,并且除了标准C ++库之外没有外部依赖性。
免责声明:我是这个图书馆的作者。
答案 3 :(得分:1)
这个怎么样,它直接使用printf:
#include <stdio.h>
#include <stdarg.h>
std::string format(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
const size_t SIZE = 512;
char buffer[SIZE] = { 0 };
vsnprintf(buffer, SIZE, fmt, ap);
va_end(ap);
return std::string(buffer);
}