std::strtol, std::strtoll
Объявлено в заголовочном файле <cstdlib> | ||
|---|---|---|
long strtol( const char* str, char** str_end, int base ); | (1) | |
long long strtoll( const char* str, char** str_end, int base ); | (2) | (начиная с C++11) |
Интерпретирует целочисленное значение в байтовой строке, на которую указывает str.
Отбрасывает все символы пробелов (определяемые вызовом std::isspace), пока не будет найден первый непробельный символ, а затем считывает максимально возможное количество символов, образующих корректное представление целого числа с основанием n (где n=base), и преобразует их в целочисленное значение. Корректное целочисленное значение состоит из следующих частей:
- (необязательно) знак плюса или минуса
-
(необязательно) префикс (
0), обозначающий восьмеричную систему счисления (применяется только если основание равно8или0) -
(необязательно) префикс (
0xили0X), обозначающий шестнадцатеричную систему счисления (применяется только если основание равно16или0) - последовательность цифр
Допустимые значения основания — {0, 2, 3, ..., 36}. Допустимые цифры для целых чисел с основанием 2 — {0, 1}, для целых чисел с основанием 3 — {0, 1, 2} и так далее. Для оснований больше 10 допустимые цифры включают буквенные символы: от Aa для целого числа с основанием 11 до Zz для целого числа с основанием 36. Регистр символов не учитывается.
Текущая установленная локаль C локаль может допускать дополнительные числовые форматы.
Если значение base равно 0, основание системы счисления определяется автоматически: если префикс — 0, основание восьмеричное; если префикс — 0x или 0X, основание шестнадцатеричное; в противном случае основание десятичное.
Если во входную последовательность входил знак минуса, числовое значение, вычисленное по последовательности цифр, меняет знак, как если бы в результирующем типе применялся унарный минус.
Функция устанавливает указатель, на который указывает str_end, так, чтобы он указывал на символ, следующий за последним обработанным символом. Если str_end — нулевой указатель, он игнорируется.
Если str пуста или имеет неверный формат, преобразование не выполняется, а значение str сохраняется в объекте, на который указывает str_end (если str_end не является нулевым указателем).
Параметры
| str | - | указатель на завершаемую нулевым символом байтовую строку, которую необходимо интерпретировать |
| str_end | - | указатель на указатель на символ |
| base | - | основание системы счисления для интерпретируемого целочисленного значения |
Возвращаемое значение
- В случае успеха возвращается целочисленное значение, соответствующее содержимому
str. - Если преобразованное значение выходит за пределы диапазона соответствующего возвращаемого типа, возникает ошибка диапазона (
errnoустанавливается вERANGE) и возвращаетсяLONG_MAX,LONG_MIN,LLONG_MAXилиLLONG_MIN(в зависимости от знака значения и возвращаемого типа). - Если преобразование выполнить невозможно, возвращается
0.
Пример
#include <cerrno>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <string>
int main()
{
const char* p = "10 200000000000000000000000000000 30 -40";
std::cout << "Parsing " << std::quoted(p) << ":\n";
for (;;)
{
// errno can be set to any non-zero value by a library function call
// regardless of whether there was an error, so it needs to be cleared
// in order to check the error set by strtol
errno = 0;
char* p_end{};
const long i = std::strtol(p, &p_end, 10);
if (p == p_end)
break;
const bool range_error = errno == ERANGE;
const std::string extracted(p, p_end - p);
p = p_end;
std::cout << "Extracted " << std::quoted(extracted)
<< ", strtol returned " << i << '.';
if (range_error)
std::cout << "\n Range error occurred.";
std::cout << '\n';
}
}
Возможный вывод:
Parsing "10 200000000000000000000000000000 30 -40": Extracted "10", strtol returned 10. Extracted " 200000000000000000000000000000", strtol returned 9223372036854775807. Range error occurred. Extracted " 30", strtol returned 30. Extracted " -40", strtol returned -40.
См. также
|
(C++11)(C++11)(C++11) | преобразует строку в целое число со знаком (функция) |
|
(C++11) | преобразует байтовую строку в целочисленное значение без знака (функция) |
|
(C++11)(C++11) | преобразует байтовую строку в std::intmax_t или std::uintmax_t (функция) |
| преобразует широкую строку в целочисленное значение (функция) |
|
| преобразует байтовую строку в значение с плавающей точкой (функция) |
|
|
(C++17) | преобразует последовательность символов в целочисленное значение или значение с плавающей точкой (функция) |
|
(C++11) | преобразует байтовую строку в целочисленное значение (функция) |
Документация по C для strtol, strtoll |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/byte/strtol