Namespaces
Variants

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

From cppreference.net
Определено в заголовочном файле <cstdlib>
int atoi ( const char * str ) ;
(1)
long atol ( const char * str ) ;
(2)
long long atoll ( const char * str ) ;
(3) (начиная с C++11)

Интерпретирует целочисленное значение в байтовой строке, на которую указывает str . Подразумеваемая система счисления всегда равна 10.

Отбрасывает любые пробельные символы до первого непробельного символа, затем принимает максимально возможное количество символов, образующих допустимое представление целого числа, и преобразует их в целочисленное значение. Допустимое целочисленное значение состоит из следующих частей:

  • (необязательно) знак плюс или минус
  • числовые цифры

Если значение результата не может быть представлено, т.е. преобразованное значение выходит за пределы диапазона соответствующего возвращаемого типа, поведение не определено.

Содержание

Параметры

str - указатель на нуль-терминированную байтовую строку для интерпретации

Возвращаемое значение

Целочисленное значение, соответствующее содержимому str при успешном выполнении.

Если преобразование не может быть выполнено, 0 возвращается.

Возможная реализация

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; // вычисление в отрицательных числах для поддержки 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);
}

Фактические реализации библиотек C++ возвращаются к реализациям библиотек C для atoi , atoil и atoll , которые либо реализуют их напрямую (как в MUSL libc ), либо делегируют вызовы strtol / strtoll (как в GNU libc ).

Пример

#include <cstdlib>
#include <iostream>
int main()
{
    const auto data =
    {
        "42",
        "0x2A", // treated as "0" and junk "x2A", not as hexadecimal
        "3.14159",
        "31337 with words",
        "words and 2",
        "-012345",
        "10000000000" // note: out of int32_t range
    };
    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';
    }
}

Возможный вывод:

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

Смотрите также

(C++11) (C++11) (C++11)
преобразует строку в знаковое целое число
(функция)
(C++11) (C++11)
преобразует строку в беззнаковое целое число
(функция)
преобразует байтовую строку в целочисленное значение
(функция)
преобразует байтовую строку в беззнаковое целочисленное значение
(функция)
(C++11) (C++11)
преобразует байтовую строку в std::intmax_t или std::uintmax_t
(функция)
(C++17)
преобразует последовательность символов в целочисленное или вещественное значение
(функция)
Документация C для atoi , atol , atoll