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