Namespaces
Variants

std:: atoi, std:: atol, std:: atoll

From cppreference.net
Défini dans l'en-tête <cstdlib>
int atoi ( const char * str ) ;
(1)
long atol ( const char * str ) ;
(2)
long long atoll ( const char * str ) ;
(3) (depuis C++11)

Interprète une valeur entière dans une chaîne d'octets pointée par str . La base implicite est toujours 10.

Ignore tous les caractères d'espacement jusqu'à ce que le premier caractère non-espace soit trouvé, puis prend autant de caractères que possible pour former une représentation valide de nombre entier et les convertit en une valeur entière. La valeur entière valide se compose des parties suivantes :

  • (optionnel) signe plus ou moins
  • chiffres numériques

Si la valeur du résultat ne peut pas être représentée, c'est-à-dire si la valeur convertie sort de la plage du type de retour correspondant, le comportement est indéfini.

Table des matières

Paramètres

str - pointeur vers la chaîne d'octets terminée par un caractère nul à interpréter

Valeur de retour

Valeur entière correspondant au contenu de str en cas de succès.

Si aucune conversion ne peut être effectuée, 0 est retourné.

Implémentation possible

template<typename T>
T atoi_impl(const char* str)
{
    while (std::isspace(static_cast<unsigned char>(*str)))
        ++str;
    bool negative = false;
    if (*str == '+')
        ++str;
    else if (*str == '-')
    {
        ++str;
        negative = true;
    }
    T result = 0;
    for (; std::isdigit(static_cast<unsigned char>(*str)); ++str)
    {
        int digit = *str - '0';
        result *= 10;
        result -= digit; // calcul en négatifs pour supporter INT_MIN, LONG_MIN,..
    }
    return negative ? result : -result;
}
int atoi(const char* str)
{
    return atoi_impl<int>(str);
}
long atol(const char* str)
{
    return atoi_impl<long>(str);
}
long long atoll(const char* str)
{
    return atoi_impl<long long>(str);
}

Les implémentations actuelles des bibliothèques C++ se rabattent sur les implémentations de la bibliothèque C pour atoi , atoil , et atoll , qui soit l'implémentent directement (comme dans MUSL libc ) soit délèguent à strtol / strtoll (comme dans GNU libc ).

Exemple

#include <cstdlib>
#include <iostream>
int main()
{
    const auto data =
    {
        "42",
        "0x2A", // traité comme "0" et déchet "x2A", pas comme hexadécimal
        "3.14159",
        "31337 with words",
        "words and 2",
        "-012345",
        "10000000000" // note : hors de la plage int32_t
    };
    for (const char* s : data)
    {
        const int i{std::atoi(s)};
        std::cout << "std::atoi('" << s << "') is " << i << '\n';
        if (const long long ll{std::atoll(s)}; i != ll)
            std::cout << "std::atoll('" << s << "') is " << ll << '\n';
    }
}

Sortie possible :

std::atoi('42') is 42
std::atoi('0x2A') is 0
std::atoi('3.14159') is 3
std::atoi('31337 with words') is 31337
std::atoi('words and 2') is 0
std::atoi('-012345') is -12345
std::atoi('10000000000') is 1410065408
std::atoll('10000000000') is 10000000000

Voir aussi

(C++11) (C++11) (C++11)
convertit une chaîne en entier signé
(fonction)
(C++11) (C++11)
convertit une chaîne en entier non signé
(fonction)
convertit une chaîne d'octets en valeur entière
(fonction)
convertit une chaîne d'octets en valeur entière non signée
(fonction)
(C++11) (C++11)
convertit une chaîne d'octets en std::intmax_t ou std::uintmax_t
(fonction)
(C++17)
convertit une séquence de caractères en valeur entière ou virgule flottante
(fonction)
Documentation C pour atoi , atol , atoll