web-dev-qa-db-fra.com

Ajouter un int à un std :: string

Pourquoi ce code donne-t-il un échec d'assertion de débogage?

   std::string query;
   int ClientID = 666;
   query = "select logged from login where id = ";
   query.append((char *)ClientID);
68
Hakon89

La méthode std::string::append() s'attend à ce que son argument soit une chaîne terminée par NULL (char*).

Il existe plusieurs approches pour produire un string contenant un int:

  • std::ostringstream

    #include <sstream>
    
    std::ostringstream s;
    s << "select logged from login where id = " << ClientID;
    std::string query(s.str());
    
  • std::to_string (C++ 11)

    std::string query("select logged from login where id = " +
                      std::to_string(ClientID));
    
  • boost::lexical_cast

    #include <boost/lexical_cast.hpp>
    
    std::string query("select logged from login where id = " +
                      boost::lexical_cast<std::string>(ClientID));
    
195
hmjd

Vous ne pouvez pas convertir un int en char * pour obtenir une chaîne. Essaye ça:

std::ostringstream sstream;
sstream << "select logged from login where id = " << ClientID;
std::string query = sstream.str();

référence de stringstream

5
luke

Vous transformez ClientID en char *, ce qui fait que la fonction assume un tableau de caractères null, ce qui n’est pas le cas.

de cplusplus.com:

string & append (const char * s); Ajoute une copie de la chaîne formée par la séquence de caractères terminée par un caractère nul (chaîne C) indiquée par s. La longueur de cette séquence de caractères est déterminée par la première occurrence d'un caractère nul (déterminé par traits.length (s)).

2
WeaselFox

J'ai l'impression que votre ClientID n'est pas de type chaîne (char* Ou std::string À zéro), mais un type intégral (par exemple, int) afin vous devez d'abord convertir le nombre en chaîne:

std::stringstream ss;
ss << ClientID;
query.append(ss.str());

Mais vous pouvez aussi utiliser operator+ (Au lieu de append):

query += ss.str();
2
Bojan Komazec