std::atoi, std::atol, std::atoll
Определено в заголовочном файле <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++ обращаются к реализациям библиотек 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) | преобразует строку байтов в целое значение без знака (функция) |
|
(C++11)(C++11) | преобразует строку байтов в std::intmax_t или std::uintmax_t (функция) |
|
(C++17) | преобразует последовательность символов в целое или значение с плавающей запятой (функция) |
Документация C для atoi, atol, atoll |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/string/byte/atoi