std::atoi, std::atol, std::atoll
| Определено в заголовочном файле <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) или делегируют их std::strtol/std::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) |
преобразует байтовую строку в беззнаковое целое число (функция) |
(C++11)(C++11) |
преобразует байтовую строку в std::intmax_t или std::uintmax_t (функция) |
(C++17) |
преобразует последовательность символов в целое число или значение с плавающей запятой (функция) |
Документация C по atoi, atol, atoll
| |