2010-10-10 4 views
1

Je reçois un problèmechaîne conversion à un problème entier dans C++

string ccc="example"; 
    int cc=atoi(csession); 

il dit cannot convert ‘std::string’ to ‘const char*’ for argument ‘1’ to ‘int atoi(const char*)’ dois-je doit convertir la chaîne en char tableau et puis appliquer à atoi ou est il y a une autre façon

+5

duplication possible de [Comment obtenir un pointeur char * vers une chaîne C++?] (Http://stackoverflow.com/questions/2707980/how-to-get-a-char-pointer-to-ac-string –

Répondre

3
istringstream in(ccc); 
int cc; 
in >> cc; 
if(in.fail()) 
{ 
    // error, ccc had invalid format, more precisely, ccc didn't begin with a number 
    //throw, or exit, or whatever 
} 

istringstream est dans l'en-tête <sstream> et au namespace std. Le code ci-dessus va extraire le premier entier de la chaîne qui est, si ccc était "123ac" cc serait 123. Si ccc étaient "abc123" alors cc aurait une valeur indéfinie et in.fail() serait vrai.

+1

Si vous mettez un contrôle que la conversion a effectivement réussi, je passerais au vote. – sbi

+0

@sbi: cela dépend de ce qu'est le succès "123abs" -> 123. Est-ce le succès? ou vous voulez dire que seul le match complet est un succès? –

+0

Bien qu'il s'agisse d'une solution C++ complète, il n'est pas recommandé d'utiliser des ressources lourdes pour être justifiées dans ce cas. 'atoi' est mieux à mon humble avis. – rubenvb

1

Utilisez .c_str() sur l'objet de chaîne pour passer à atoi

1

Hehe, nice one Armen. Voici une solution en utilisant boost :: lexical_cast:

#include <boost/lexical_cast.hpp> 
. 
. 
. 
int c = boost::lexical_cast<int>(csession); 

Documentation disponible ici: boost::lexical_cast.

+0

Vous êtes un grand fan de boost et un expert hein?:))) –

+1

@raja: La solution de Daniel est beaucoup mieux en termes de "joliesse" et de facilité d'utilisation. Cependant, si vous n'avez pas de boost sur votre machine, ou si vous ne voulez pas gaspiller (WASTE? !!! :) le temps de télécharger et d'installer, je crois que ma version est encore meilleure que celle d'utiliser atoi. –

+0

@Armen: Oui, je suis très certainement! :-) Un fan, c'est! –

2

Selon votre description, peut-être ce que vous voulez est:

chaîne ccc = "exemple"; int cc = atoi (ccc.c_str());

+1

C'est la meilleure solution. Exactement ce que j'utiliserais dans ce cas. Dans certains cas, j'utiliserais aussi 'strtol' si j'avais besoin du caractère de fin non convertible dans la chaîne. Utiliser un flux temporaire pour convertir 'std :: string' en' int' est ridicule. +1 –

Questions connexes