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