Spec-Zone.ru › C++

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

Эта страница посвящена преобразованию ASCII-строки в целое число в стиле C. Это не имеет отношения к iota, которая генерирует возрастающие диапазоны целых чисел, также известные как последовательности iota (по греческой букве ι).
Определено в заголовочном файле <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; // calculate in negatives to support 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++ используют реализации функций atoi, atoil и atoll из библиотеки C: они либо реализуют их напрямую (как в MUSL libc), либо делегируют вызов функциям strtol/strtoll (как в GNU libc).

Пример

#include <array>
#include <cstdlib>
#include <iostream>
#include <locale>
#include <numeric>

int main()
{
    std::cout.imbue(std::locale("en_US.UTF-8"));
    std::array<char, 8> arr;
    std::iota(arr.begin(), arr.begin() + arr.size() - 1, '1');
    arr.back() = '\0';
    const int num{std::atoi(arr.data())};
    std::cout << "arr = " << arr.data() << "\n"
                 "num = " << num << '\n';

    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';
    }
}

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

arr = 1234567
num = 1,234,567
std::atoi('42') is 42
std::atoi('0x2A') is 0
std::atoi('3.14159') is 3
std::atoi('31337 with words') is 31,337
std::atoi('words and 2') is 0
std::atoi('-012345') is -12,345
std::atoi('10000000000') is 1,410,065,408
std::atoll('10000000000') is 10,000,000,000

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/byte/atoi

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API