Namespaces
Variants

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

From cppreference.net
Definido en el encabezado <cstdlib>
int atoi ( const char * str ) ;
(1)
long atol ( const char * str ) ;
(2)
long long atoll ( const char * str ) ;
(3) (desde C++11)

Interpreta un valor entero en una cadena de bytes apuntada por str . La base implícita es siempre 10.

Descarta cualquier carácter de espacio en blanco hasta que se encuentra el primer carácter que no es un espacio en blanco, luego toma tantos caracteres como sea posible para formar una representación válida de número entero y los convierte en un valor entero. El valor entero válido consta de las siguientes partes:

  • (opcional) signo más o menos
  • dígitos numéricos

Si el valor del resultado no puede ser representado, es decir, el valor convertido cae fuera del rango del tipo de retorno correspondiente, el comportamiento es indefinido.

Contenidos

Parámetros

str - puntero a la cadena de bytes terminada en nulo que se va a interpretar

Valor de retorno

Valor entero correspondiente al contenido de str en caso de éxito.

Si no se puede realizar ninguna conversión, 0 es retornado.

Implementación posible

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; // calcular en negativos para soportar 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);
}

Las implementaciones reales de bibliotecas C++ recurren a las implementaciones de bibliotecas C de atoi , atoil , y atoll , que o bien la implementan directamente (como en MUSL libc ) o delegan en strtol / strtoll (como en GNU libc ).

Ejemplo

#include <cstdlib>
#include <iostream>
int main()
{
    const auto data =
    {
        "42",
        "0x2A", // tratado como "0" y basura "x2A", no como hexadecimal
        "3.14159",
        "31337 with words",
        "words and 2",
        "-012345",
        "10000000000" // nota: fuera del rango de 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';
    }
}

Salida posible:

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

Véase también

(C++11) (C++11) (C++11)
convierte una cadena a un entero con signo
(función)
(C++11) (C++11)
convierte una cadena a un entero sin signo
(función)
convierte una cadena de bytes a un valor entero
(función)
convierte una cadena de bytes a un valor entero sin signo
(función)
(C++11) (C++11)
convierte una cadena de bytes a std::intmax_t o std::uintmax_t
(función)
(C++17)
convierte una secuencia de caracteres a un valor entero o de punto flotante
(función)
Documentación de C para atoi , atol , atoll