спринтф в с ++? - PullRequest
       22

спринтф в с ++?

2 голосов
/ 11 мая 2011

Я ищу sprintf в c ++.

Я хочу создать строку запроса mysql, но если я сделаю это так (max_limit - это const int)

std::string query = "select * from bla limit " + max_limit;

Запрос не сработает.

Ответы [ 4 ]

9 голосов
/ 11 мая 2011

В C ++ 11 это сделано слишком просто.Используйте std::to_string() как:

std::string query = "select * from bla limit " + std::to_string(max_limit);

Готово!


СТАРЫЕ РЕШЕНИЯ, для тех, кто все еще использует C ++ 03.

Используйте stringbuilder и создайте std::string на лету как:

std::string query = stringbuilder() << "select * from bla limit " << max_limit;

, где stringbuilder реализовано как:

struct stringbuilder
{
   std::stringstream ss;
   template<typename T>
   stringbuilder & operator << (const T &data)
   {
        ss << data;
        return *this;
   }
   operator std::string() { return ss.str(); }
};

Вы можете использовать stringbuilderразличными способами, такими как:

std::string g(int m, int n) 
{
    //create string on the fly and returns it
    if ( m < n )
        return stringbuilder() << m << " is less than " << n ;
    return stringbuilder() << n << " is less than " << m ;
}

void f(const std::string & s );

//call f while creating string on the fly and passing it to the function
f(stringbuilder() << '{' << pc << '}' ); //passed as std::string

//this is my most favorite line
std::string s = stringbuilder() << 23  << " is greater than " << 5 ;

См. демонстрационную версию на ideone: http://ideone.com/J995r

И посмотрите мой блог на это: Создайте строку на лету только в одну строку

6 голосов
/ 11 мая 2011

Вам не нужен sprintf, он не работает со строками. Примерно так:

#include <sstream>
#include <string>

template <typename T>
std::string Str( const T & t ) {
    std::ostringstream os;
    os << t;
    return os.str();
}

сделает работу. Затем вы можете сказать:

std::string query = "select * from bla limit " + Str( max_limit );
4 голосов
/ 11 мая 2011

Возможно, вы захотите взглянуть на boost :: format lib.Он предоставляет синтаксис sprintf с удобством c ++.
Итак, ваш пример будет:

std::string str = (boost::format("select * from bla limit %d") % max_limit).str();
0 голосов
/ 11 мая 2011

Или просто использовать макрос?#define QueryString(msg) ((static_cast<std::ostringstream&>(std::ostringstream().seekp(0, std::ios_base::cur)<<msg)).str())

Использование: std::string query = QueryString("select * from mytable where x="<<30);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...