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
|