Existe-t-il une fonction qui pourrait remplacer atoi dans c ++. J'ai fait des recherches et je n'ai rien trouvé pour le remplacer, les seules solutions seraient d'utiliser cstdlib ou de le mettre en œuvre moi-même.
Si vous ne souhaitez pas utiliser Boost, C++ 11 a ajouté std::stoi
pour les chaînes. Des méthodes similaires existent pour tous les types.
std::string s = "123"
int num = std::stoi(s);
Contrairement à atoi
, si aucune conversion ne peut être effectuée, une exception invalid_argument
est levée. De plus, si la valeur est hors limites pour un int, une exception out_of_range
est levée.
boost::lexical_cast
est votre ami
#include <string>
#include <boost/lexical_cast.hpp>
int main()
{
std::string s = "123";
try
{
int i = boost::lexical_cast<int>(s); //i == 123
}
catch(const boost::bad_lexical_cast&)
{
//incorrect format
}
}
Vous pouvez utiliser la fonction Boost boost :: lexical_cast <> comme suit:
char* numericString = "911";
int num = boost::lexical_cast<int>( numericString );
Plus d'informations peuvent être trouvées ici (dernière version 1.47 de Boost). N'oubliez pas de gérer les exceptions de manière appropriée.
Sans boost:stringstream ss(my_string_with_a_number); int my_res; ss >> my_res;
À peu près aussi ennuyeux que la version boost mais sans la dépendance ajoutée. Pourrait éventuellement perdre plus de bélier.
Vous ne dites pas pourquoi atoi
n'est pas approprié, je vais donc deviner que cela a quelque chose à voir avec la performance. De toute façon, des éclaircissements seraient utiles.
L'utilisation de Boost Spirit.Qi est d'un ordre de grandeur plus rapide que atoi
, au moins dans tests effectués par Alex Ott .
Je n'ai pas de référence, mais la dernière fois que je l'ai testée, Boost lexical_cast
était à peu près d'un ordre de grandeur inférieur à atoi
. Je pense que la raison en est qu’il construit un stringstream, ce qui est assez coûteux.
Update : Quelques tests plus récents
Vous pouvez utiliser la fonction stoi();
#include <string>
// Need to include the <string> library to use stoi
int mani(){
std::string s = "10";
int n = stoi(s);
}
Pour compiler cela, vous devrez activer c ++ 11, chercher sur Google comment le faire (sur code :: blocks c'est: Settings -> Compiler -> "Demandez à g ++ de suivre C++ 11 le langage standard ISO C++") Si vous compilez depuis un terminal, vous devez ajouter -std = c ++ 11
g++ -std=c++11 -o program program.cpp