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 locale.
Если значение 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 << "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/w/cpp/string/byte/strtol