C ++中快速格式化的字符串

时间:2011-04-16 12:51:41

标签: c++ string formatting

构造std :: string时是否有一种快速简便的方法来获得类似sprintf的格式?有点像...

std::string foo("A number (%d) and a character (%c).\n", 18, 'a');

4 个答案:

答案 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); 
}