web-dev-qa-db-fra.com

équivalent d'atoi

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.

23
Mansuro

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.

16
drinck

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   
    }
}
9
Armen Tsirunyan

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.

4
Andrew Humphries

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.

3
Torp

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

2
Alastair

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
0
Mirco De Zorzi