Пространства имён
Варианты
Действия

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

Материал из cppreference.com
< cpp‎ | string‎ | byte
 
 
 
Однобайтовые строки с завершающим нулём
Функции
Манипуляции с символами
Преобразование в числовые форматы
atoiatolatoll
(C++11)

(C++11)(C++11)
(C++11)(C++11)
Манипуляции со строками
Проверка строки
Манипуляции с памятью
Разное
 
Определено в заголовочном файле <cstdlib>
int       atoi( const char *str );
long      atol( const char *str );
long long atoll( const char *str );
(начиная с 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", // обрабатывается как "0" и мусор "x2A", а не как шестнадцатеричное
        "3.14159",
        "31337 со словами",
        "слова и 2",
        "-012345",
        "10000000000" // примечание: вне диапазона int32_t
    };
 
    for (const char* s : data)
    {
        const int i {std::atoi(s)};
        std::cout << "std::atoi('" << s << "') равно " << i << '\n';
        if (const long long ll {std::atoll(s)}; i != ll)
            std::cout << "std::atoll('" << s << "') равно " << ll << '\n';
    }
}

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

std::atoi('42') равно 42
std::atoi('0x2A') равно 0
std::atoi('3.14159') равно 3
std::atoi('31337 со словами') равно 31337
std::atoi('слова и 2') равно 0
std::atoi('-012345') равно -12345
std::atoi('10000000000') равно 1410065408
std::atoll('10000000000') равно 10000000000

[править] Смотрите также

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