std::strtol, std::strtoll
| Определено в заголовочном файле <cstdlib>
|
||
long strtol( const char *str, char **str_end, int base ); |
||
long long strtoll( const char *str, char **str_end, int base ); |
(начиная с 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_end не является нулевым указателем) значение str будет хранится в объекте, на который указывает 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 << "Разбор " << std::quoted(p) << ":\n";
for (;;)
{
// errno может быть установлено в любое ненулевое значение вызовом
// библиотечной функции независимо от того, была ли ошибка, поэтому
// его необходимо очистить, чтобы проверить ошибку, установленную 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 << "Извлечено " << std::quoted(extracted)
<< ", strtol возвращает " << i << '.';
if (range_error)
std::cout << "\n Произошла ошибка диапазона.";
std::cout << '\n';
}
}
Возможный вывод:
Разбор "10 200000000000000000000000000000 30 -40":
Извлечено "10", strtol возвращает 10.
Извлечено " 200000000000000000000000000000", strtol возвращает 9223372036854775807.
Произошла ошибка диапазона.
Извлечено " 30", strtol возвращает 30.
Извлечено " -40", strtol возвращает -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
| |