71 votes

Ajoute un int à une std::string

Pourquoi ce code donne-t-il un Debug Assertion Fail ?

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

200voto

hmjd Points 76411

Le site 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));

5voto

luke Points 16255

Vous ne pouvez pas convertir un int en char* pour obtenir une chaîne de caractères. Essayez ceci :

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

référence stringstream

2voto

Bojan Komazec Points 4248

J'ai le sentiment que votre ClientID n'est pas de type chaîne de caractères (à terminaison nulle). char* ou std::string ) mais un certain type d'intégrale (par ex. int ), vous devez donc d'abord convertir le nombre en chaîne de caractères :

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

Mais vous pouvez utiliser operator+ également (au lieu de append ) :

query += ss.str();

2voto

WeaselFox Points 3283

Vous faites un casting ClientID en char*, ce qui fait que la fonction suppose qu'il s'agit d'un tableau de chars à terminaison nulle, ce qui n'est pas le cas.

de cplusplus.com :

string& append ( const char * s ) ; Applique une copie de la chaîne de caractères formée formée par la séquence de caractères à terminaison nulle (chaîne C) pointée par s. longueur de cette séquence de caractères est déterminée par la première ocurrence d'un caractère nul (comme déterminé par traits.length(s)).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X