Sdílet prostřednictvím


<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, lastkde [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 lasta 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::fixedchars_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 firsta 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 valuetypem , 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()