<charconv>
– funkce
Hlavička <charconv> obsahuje následující nečlenné funkce:
Nečlenové funkce | Popis |
---|---|
to_chars | Převede celočíselnou hodnotu nebo hodnotu s plovoucí desetinou čárkou na sekvenci char . |
from_chars | Převede posloupnost char na celé číslo nebo hodnotu s plovoucí desetinou čárkou. |
Tyto převodní funkce jsou vyladěné pro výkon a podporují také nejkratší chování odezvy. Chování nejkratší odezvy znamená, že když je číslo převedeno na znaky, je zapsáno pouze dostatek přesnosti, aby bylo možné obnovit původní číslo při převodu těchto znaků zpět na plovoucí desetinnou čárku.
- Při převodu znaků na číslo nemusí být číselná hodnota ukončena hodnotou null. Stejně tak při převodu čísla na znaky se výsledek neukončí null.
- Funkce převodu nepřidělují paměť. Ve všech případech vlastníte vyrovnávací paměť.
- Převodní funkce se nevyvolají. Vrátí se výsledek, ze kterého můžete zjistit, jestli převod proběhl úspěšně.
- Převodní funkce nejsou citlivé na režim zaokrouhlení zaokrouhlení za běhu.
- Funkce převodu nerozujímají národní prostředí. Vždy tisknou a parsují desetinné čárky jako
'.'
a nikdy jako ", pro národní prostředí, která používají čárky.
to_chars
Převede celočíselnou hodnotu nebo hodnotu s plovoucí desetinou čárkou na sekvenci char
.
value
Převede se na řetězec znaků vyplněním oblasti [first
, last
kde [first
, last
) musí být platná oblast.
Vrátí to_chars_result strukturu. Pokud je převod úspěšný, jak je uvedeno to_char_result.ec
, člen ptr
je ukazatel 1-past-the-end znaků zapsaných. to_char_result.ec
V opačném případě má hodnotu errc::value_too_large
, to_char_result.ptr
má hodnotu last
a obsah rozsahu [first
, last
) nejsou zadány.
Jediný způsob, jak může selhat, je v případě, že to_chars
zadáte nedostatečně velkou vyrovnávací paměť pro uložení výsledku.
// 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);
Parametry
první
Odkazuje na začátek vyrovnávací paměti, která se má vyplnit.
poslední
Odkazuje na jeden znak za konec vyrovnávací paměti, aby se vyplnil.
value
Hodnota, kterou chcete převést. Je-li value
záporné, reprezentace začíná -
na .
base
Pro celočíselné převody je základ, který se použije při převodu value
na znaky. Musí být mezi 2 a 36 včetně. Nebudou žádné úvodní nuly. Číslice v rozsahu 10..35 (včetně) jsou reprezentovány malými písmeny a.. z
Fmt
U převodů s plovoucí desetinou čárkou je bitová maska určující formát převodu, který se má použít, například vědecký, pevný nebo šestnáctkový. Podrobnosti najdete v chars_format .
přesnost
U převodů s plovoucí desetinnou čárkou je počet číslic přesnosti pro převedenou hodnotu.
Vrácená hodnota
To_chars_result obsahující výsledek převodu.
Poznámky
Funkce používající chars_format parametr určují specifikátor převodu, jako by používaly printf()
následující: Specifikátor převodu je,pokud je 'f'
, pokud fmt
je , pokud fmt
je chars_format::fixed
chars_format::scientific
, 'e'
'a'
(bez úvodního 0x
v výsledku), pokud fmt
je chars_format::hex
, a 'g'
pokud fmt
je chars_format::general
. Zadání nejkratší pevné notace může stále vést k dlouhému výstupu, protože může být nejkratší možnou reprezentací, pokud je hodnota velmi velká nebo velmi malá.
Následující tabulka popisuje chování převodu vzhledem k různým kombinacím fmt
a precision
parametrům. Termín "chování nejkratší doby odezvy" označuje zápis nejmenšího počtu číslic nezbytných k analýze této reprezentace pomocí odpovídající from_chars
funkce obnoví hodnotu přesně.
fmt a precision kombinace |
Výstup |
---|---|
Ani jedno | Podle toho, která z pevných nebo vědeckých notací je kratší, preferuje se jako tiebreaker. Toto chování nemůže být simulováno žádným přetížením, které přebírá fmt parametr. |
fmt |
Nejkratší chování odezvy pro zadaný formát, například nejkratší vědecký formát. |
fmt a precision |
Použije danou přesnost následující printf() styl bez chování nejkratší odezvy. |
Příklad
#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
Převede posloupnost char
na celé číslo nebo hodnotu s plovoucí desetinou čárkou.
// 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);
Parametry
první
Odkazuje na začátek vyrovnávací paměti znaků, které se mají převést.
poslední
Odkazuje na jeden za koncový prvek vyrovnávací paměti znaků, které se mají převést.
value
Pokud je převod úspěšný, obsahuje výsledek převodu.
base
Pro celočíselné převody je základ, který se použije během převodu. Musí být mezi 2 a 36 včetně.
Fmt
U převodů s plovoucí desetinou čárkou formát sekvence znaků, která se převádí. Podrobnosti najdete v chars_format .
Poznámky
Funkce from_chars()
analyzují řetězec [first
, last
) pro číselný vzor, kde [first
, last
) musí být platným rozsahem.
Při analýze znaků se prázdné znaky ignorují. Na rozdíl od strtod()
například vyrovnávací paměti musí začínat platnou číselnou reprezentací.
Vrátí from_chars_result strukturu.
Pokud žádné znaky neodpovídají číselnému vzoru, value
je nezměněný, from_chars_result.ptr
odkazuje na first
a from_chars_result.ec
je errc::invalid_argument
.
Pokud pouze některé znaky odpovídají číselnému vzoru, from_chars_result.ptr
odkazuje na první znak, který neodpovídá vzoru, nebo má hodnotu parametru last
, pokud se shodují všechny znaky.
Pokud parsovaná hodnota není v rozsahu reprezentovatelném value
typem , value
je nezměněna a from_chars_result.ec
je errc::result_out_of_range
.
value
V opačném případě je nastavena na parsovanou hodnotu po zaokrouhlení a from_chars_result.ec
je rovna errc{}
.
Příklad
#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;
}
Požadavky
Header:<charconv>
Obor názvů: std
/std:c++17
nebo novější se vyžaduje.
Viz také
<charconv>
Nejkratší desetinný řetězec, který zaokrouhlujespecifikátory formátu printf()