在构造std::string时,是否有一种快速简便的方法来获得类似于sprintf的格式化功能?就像这样...
std::string foo("A number (%d) and a character (%c).\n", 18, 'a');
在构造std::string时,是否有一种快速简便的方法来获得类似于sprintf的格式化功能?就像这样...
std::string foo("A number (%d) and a character (%c).\n", 18, 'a');
虽然字符串的构造函数中不包含此功能,但你可能希望查看boost format。它是一种更安全的sprintf样式的字符串格式化工具。通过它,至少可以实现以下内容:
std::string foo =
boost::str(boost::format("A number (%d) and a character (%c)\n") % 18 % 'a');
18
字面量替换为 uint8_t
,然后,你的 Boost 输出就会完全崩溃:你将收到两个字符而不是带有数字的字符。 - Anton Samsonovstd::string s=stringbuilder() << "A number " << 18 <<" and a character " <<'a';
< p > 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
的许多不同方式。
printf("J'ai vu des oiseaux %s", adjective);
通过流来实现:os << "J'ai vu des oiseaux " << adjective
。然而在英语中,os << "I have seen birds " << adjective
是不正确的。你需要使用printf("I have seen %s birds", adjective)
来表示。这个句子的分割方式完全不同。在这种情况下,你需要使用 C 风格格式化而不是流。(或者你需要为每个语言更改流,但这很繁琐,请查看 gettext 如何处理资源)。 - Matthieu M.fmt库提供了一种安全的sprintf
实现,可以返回字符串:
std::string foo = fmt::sprintf("A number (%d) and a character (%c).\n", 18, 'a');
str.format
语法。std::string foo = fmt::format("A number ({}) and a character ({}).\n", 18, 'a');
这个库的目的类似于Boost Format,但是它速度更快,体积较小,并且除了标准C ++库之外没有其他外部依赖。
免责声明:我是这个库的作者。
这个怎么样,它直接使用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);
}
vsnprintf
的返回值以分配正确大小的缓冲区,而不是将其截断为512个字符。或者在Linux上使用asprintf
。此外,使用gcc风格的函数属性,以便在参数上仍然获得一些类型安全性。 - poolie