<charconv>
Функции
Заголовок <charconv> включает следующие функции, не являющиеся членами:
Функции, не являющиеся членами | Description |
---|---|
to_chars | Преобразуйте целочисленное или плавающее значение в последовательность char . |
from_chars | Преобразуйте последовательность char в целочисленное или плавающее значение. |
Эти функции преобразования настраиваются для повышения производительности, а также поддерживают поведение кратчайшего кругового пути. Поведение кратчайшего кругового пути означает, что при преобразовании числа в символы записывается только достаточная точность, чтобы включить восстановление исходного числа при преобразовании этих знаков обратно в плавающую точку.
- При преобразовании символов в число числовое значение не требуется завершать значение NULL. Аналогичным образом, при преобразовании числа в символы результат не завершается значением NULL.
- Функции преобразования не выделяют память. Буфер принадлежит во всех случаях.
- Функции преобразования не вызываются. Результат возвращается, из которого можно определить, успешно ли выполнено преобразование.
- Функции преобразования не учитывается в режиме округления среды выполнения.
- Функции преобразования не знают языкового стандарта. Они всегда печатают и анализируют десятичные знаки как
'.'
, и никогда не как ", для языковых стандартов, использующих запятые.
to_chars
Преобразуйте целочисленное или плавающее значение в последовательность char
.
Преобразуется в символьную строку, заполнив value
диапазон [first
, last
где [first
, last
) должен быть допустимым диапазоном.
Возвращает структуру to_chars_result. Если преобразование выполнено успешно, как указано to_char_result.ec
, элемент ptr
является одним из конечных указателей на записанные символы. to_char_result.ec
В противном случае имеет значение, to_char_result.ptr
имеет значениеlast
errc::value_too_large
, а содержимое диапазона [first
, last
) не указано.
Единственный способ, который может завершиться сбоем, заключается в том, что to_chars
при наличии недостаточно большого буфера для хранения результата.
// integer to chars
to_chars_result to_chars(char* first, char* last, char value, int base = 10);
to_chars_result to_chars(char* first, char* last, signed char value, int base = 10);
to_chars_result to_chars(char* first, char* last, unsigned char value, int base = 10);
to_chars_result to_chars(char* first, char* last, short value, int base = 10);
to_chars_result to_chars(char* first, char* last, unsigned short value, int base = 10);
to_chars_result to_chars(char* first, char* last, int value, int base = 10);
to_chars_result to_chars(char* first, char* last, unsigned int value, int base = 10);
to_chars_result to_chars(char* first, char* last, long value, int base = 10);
to_chars_result to_chars(char* first, char* last, unsigned long value, int base = 10);
to_chars_result to_chars(char* first, char* last, long long value, int base = 10);
to_chars_result to_chars(char* first, char* last, unsigned long long value, int base = 10);
to_chars_result to_chars(char* first, char* last, bool value, int base = 10) = delete;
// floating-point to chars
to_chars_result to_chars(char* first, char* last, float value);
to_chars_result to_chars(char* first, char* last, double value);
to_chars_result to_chars(char* first, char* last, long double value);
to_chars_result to_chars(char* first, char* last, float value, chars_format fmt);
to_chars_result to_chars(char* first, char* last, double value, chars_format fmt);
to_chars_result to_chars(char* first, char* last, long double value, chars_format fmt);
to_chars_result to_chars(char* first, char* last, float value, chars_format fmt, int precision);
to_chars_result to_chars(char* first, char* last, double value, chars_format fmt, int precision);
to_chars_result to_chars(char* first, char* last, long double value, chars_format fmt, int precision);
Параметры
first
Указывает на начало заполняемого буфера.
last
Указывает один символ за конец буфера для заполнения.
значение
Преобразуемое значение . Если value
отрицательный, представление начинается с -
.
base
Для целочисленных преобразований база, используемая при преобразовании value
в символы. Должно быть от 2 до 36 включительно. Не будет начальных нулей. Цифры в диапазоне 10..35 (включительно) представлены как строчные символы a.. z
fmt
Для преобразования с плавающей запятой битовая маска, указывающая формат преобразования, используемый, например научный, фиксированный или шестнадцатеричный. Дополнительные сведения см . в chars_format .
precision
Для преобразования с плавающей запятой число цифр точности для преобразованного значения.
Возвращаемое значение
To_chars_result, содержащий результат преобразования.
Замечания
Функции, принимающие параметр chars_format, определяют описатель преобразования, как если бы они использовались printf()
следующим образом: описатель преобразования имеет значение , если fmt
'a'
chars_format::scientific
fmt
имеет chars_format::fixed
значение 'f'
, 'e'
(без ведущего 0x
в результате), если fmt
имеет значение , и fmt
'g'
если имеет значение .chars_format::general
chars_format::hex
Указание короткой фиксированной нотации может по-прежнему привести к длительным выходным данным, так как это может быть самым коротким представлением, если значение очень большое или очень небольшое.
В следующей таблице описывается поведение преобразования с учетом различных сочетаний fmt
и precision
параметров. Термин "поведение кратчайшего кругового пути" относится к написанию наименьшего количества цифр, необходимых таким образом, чтобы синтаксический анализ этого представления с помощью соответствующей from_chars
функции восстанавливал значение точно.
fmt и precision сочетание |
Выходные данные |
---|---|
Нет | Независимо от фиксированной или научной нотации короче, предпочитая исправить как тай-брейк. Это поведение нельзя имитировать с помощью какой-либо перегрузки, которая принимает fmt параметр. |
fmt |
Поведение с коротким циклом для указанного формата, например самого короткого научного формата. |
fmt и precision . |
Использует заданную точность, следующую printf() по стилю, без поведения кратчайшего кругового пути. |
Пример
#include <charconv>
#include <stdio.h>
#include <system_error>
template <typename T> void TestToChars(const T t)
{
static_assert(std::is_floating_point_v<T>);
constexpr bool IsFloat = std::is_same_v<T, float>;
char buf[100]; // 100 is large enough for double and long double values because the longest possible outputs are "-1.23456735e-36" and "-1.2345678901234567e-100".
constexpr size_t size = IsFloat ? 15 : 24;
const std::to_chars_result res = std::to_chars(buf, buf + size, t); // points to buffer area it can use. Must be char, not wchar_t, etc.
if (res.ec == std::errc{}) // no error
{
// %.*s provides the exact number of characters to output because the output range, [buf, res.ptr), isn't null-terminated
printf("success: %.*s\n", static_cast<int>(res.ptr - buf), buf);
}
else // probably std::errc::value_too_large
{
printf("Error: %d\n", static_cast<int>(res.ec));
}
}
int main()
{
TestToChars(123.34);
return 0;
}
from_chars
Преобразуйте последовательность char
в целочисленное или плавающее значение.
// char to an integer value
from_chars_result from_chars(const char* first, const char* last, char& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, signed char& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, unsigned char& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, short& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, unsigned short& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, int& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, unsigned int& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, long& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, unsigned long& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, long long& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, unsigned long long& value, int base = 10);
// char to a floating-point value
from_chars_result from_chars(const char* first, const char* last, float& value, chars_format fmt = chars_format::general);
from_chars_result from_chars(const char* first, const char* last, double& value, chars_format fmt = chars_format::general);
from_chars_result from_chars(const char* first, const char* last, long double& value, chars_format fmt = chars_format::general);
Параметры
first
Указывает на начало буфера символов для преобразования.
last
Указывает один за конечным элементом буфера символов для преобразования.
значение
Если преобразование выполнено успешно, содержит результат преобразования.
base
Для целочисленных преобразований база, используемая во время преобразования. Должно быть от 2 до 36 включительно.
fmt
Для преобразования с плавающей запятой формат преобразуемой последовательности символов. Дополнительные сведения см . в chars_format .
Замечания
from_chars()
Функции анализируют строку [first
, last
) для шаблона числа, где [first
, last
) является допустимым диапазоном.
При синтаксическом анализе пробелы не игнорируются. В отличие strtod()
от буфера, например, должен начинаться с допустимого числового представления.
Возвращает структуру from_chars_result.
Если символы не соответствуют шаблону чисел, не изменены, value
from_chars_result.ptr
указывает на first
и from_chars_result.ec
имеет значение errc::invalid_argument
.
Если только некоторые символы соответствуют числовой схеме, from_chars_result.ptr
указывает на первый символ, не соответствующий шаблону, или значение last
параметра, если все символы совпадают.
Если проанализированное значение не находится в диапазоне, представляющегося типом value
, value
не изменено и from_chars_result.ec
имеет значение errc::result_out_of_range
.
В противном случае задано значение синтаксического анализа, value
после округления и from_chars_result.ec
равно errc{}
.
Пример
#include <charconv>
#include <stdio.h>
#include <string_view>
#include <system_error>
double TestFromChars(const std::string_view sv)
{
const char* const first = sv.data();
const char* const last = first + sv.size();
double dbl;
const std::from_chars_result res = std::from_chars(first, last, dbl);
if (res.ec == std::errc{}) // no error
{
printf("success: %g\n", dbl);
}
else
{
printf("Error: %d\n", static_cast<int>(res.ec));
}
return dbl;
}
int main()
{
double dbl = TestFromChars("123.34");
return 0;
}
Требования
Заголовок:<charconv>
Пространство имен: std
/std:c++17
или более поздней версии требуется.
См. также
<charconv>
Кратчайшее десятичное число, указывающее формат printf() круговых путей