Freigeben über


<charconv> -Funktionen

Der <Charconv-Header> enthält die folgenden Nicht-Member-Funktionen:

Nicht-Member-Funktionen Beschreibung
to_chars Wandeln Sie einen ganzzahligen Oder Gleitkommawert in eine Abfolge von char.
from_chars Wandeln Sie eine Sequenz von char einer ganzen Zahl oder einem Gleitkommawert um.

Diese Konvertierungsfunktionen sind für die Leistung optimiert und unterstützen auch das kürzeste Roundtrip-Verhalten. Das kürzeste Roundtrip-Verhalten bedeutet, dass beim Konvertieren einer Zahl in Zeichen nur genügend Genauigkeit geschrieben wird, um das Wiederherstellen der ursprünglichen Zahl beim Konvertieren dieser Zeichen in einen Gleitkommapunkt zu ermöglichen.

  • Beim Konvertieren von Zeichen in eine Zahl muss der numerische Wert nicht null beendet werden. Ebenso wird das Ergebnis beim Konvertieren einer Zahl in Zeichen nicht null beendet.
  • Die Konvertierungsfunktionen weisen keinen Speicher zu. Sie besitzen den Puffer in allen Fällen.
  • Die Konvertierungsfunktionen werden nicht ausgelöst. Ein Ergebnis wird zurückgegeben, aus dem Sie ermitteln können, ob die Konvertierung erfolgreich war.
  • Die Konvertierungsfunktionen sind nicht zur Laufzeit rundungsmodus vertraulich.
  • Die Konvertierungsfunktionen sind nicht gebietsschemafähig. Sie drucken und analysieren immer dezimale Punkte als '.', und nie als "," für Gebietsschemas, die Kommas verwenden.

to_chars

Wandeln Sie einen ganzzahligen Oder Gleitkommawert in eine Abfolge von char.

Wandelt value in eine Zeichenfolge um, indem der Bereich [, ), wobei [firstfirst, lastlast) ein gültiger Bereich sein muss. Gibt eine to_chars_result Struktur zurück. Wenn die Konvertierung erfolgreich ist, wie durch to_char_result.ecsie angegeben, ist das Element ptr der Einfügezeiger der geschriebenen Zeichen. to_char_result.ec Andernfalls weist der Wert den Wert errc::value_too_largeaufto_char_result.ptr, hat den Wertlast, und der Inhalt des Bereichs [first, last) ist nicht angegeben.

Die einzige Möglichkeit, die fehlschlägt, ist, to_chars wenn Sie einen unzureichend großen Puffer bereitstellen, um das Ergebnis zu speichern.

// 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);

Parameter

first
Zeigt auf den Anfang des zu füllenden Puffers.

last
Zeigt ein Zeichen über das Ende des Zufüllens des Puffers.

value
Der zu konvertierende Wert. Ist value dies negativ, beginnt die Darstellung mit -.

base
Bei ganzzahligen Konvertierungen verwendet die Basis, die beim Konvertieren in Zeichen verwendet werden value soll. Muss zwischen 2 und 36 einschließlich liegen. Es werden keine führenden Nullen vorhanden sein. Ziffern im Bereich 10,.35 (einschließlich) werden als Kleinbuchstaben a.) dargestellt. Z

Fmt
Bei Gleitkommakonvertierungen gibt eine Bitmaske das zu verwendende Konvertierungsformat an, z. B. wissenschaftlich, fest oder hexadezimal. Weitere Informationen finden Sie unter chars_format .

precision
Bei Gleitkommakonvertierungen wird die Anzahl der Ziffern der Genauigkeit für den konvertierten Wert verwendet.

Rückgabewert

Eine to_chars_result , die das Ergebnis der Konvertierung enthält.

Hinweise

Funktionen, die einen chars_format Parameter verwenden, bestimmen den Konvertierungsbezeichner wie printf() folgt: Der Konvertierungsspezifizierer ist 'f'chars_format::fixedfmt'e' , wenn fmt , ( 'a'chars_format::scientificohne die führende 0x im Ergebnis) ist , wenn fmt jachars_format::hex, und 'g' wenn fmt ja.chars_format::general Die Angabe der kürzesten festen Schreibweise kann dennoch zu einer langwierigen Ausgabe führen, da dies die kürzeste mögliche Darstellung sein kann, wenn der Wert sehr groß oder sehr klein ist.

In der folgenden Tabelle wird das Konvertierungsverhalten mit unterschiedlichen Kombinationen und fmtprecision Parametern beschrieben. Der Begriff "kürzestes Roundtrip-Verhalten" bezieht sich auf das Schreiben der wenigen erforderlichen Ziffern, sodass die Analyse, dass die Darstellung mit der entsprechenden from_chars Funktion den Wert genau wiederherstellen wird.

fmt und precision Kombination Ausgabe
Neither Je nachdem, welche feste oder wissenschaftliche Schreibweise kürzer ist, bevorzugt fest als Tiebreaker.
Dieses Verhalten kann nicht durch eine Überladung simuliert werden, die den fmt Parameter verwendet.
fmt Das kürzeste Roundtripverhalten für das angegebene Format, z. B. das kürzeste wissenschaftliche Format.
fmt und precision Verwendet die gegebene Genauigkeit, die folgende printf() Formatvorlage, ohne das Verhalten des kürzesten Roundtrips.

Beispiel

#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

Wandeln Sie eine Sequenz von char einer ganzen Zahl oder einem Gleitkommawert um.

// 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);

Parameter

first
Verweist auf den Anfang des zu konvertierenden Zeichenpuffers.

last
Zeigt eins über das Endelement des zu konvertierenden Zeichenpuffers.

value
Wenn die Konvertierung erfolgreich ist, enthält sie das Ergebnis der Konvertierung.

base
Bei ganzzahligen Konvertierungen wird die Basis verwendet, die während der Konvertierung verwendet werden soll. Muss zwischen 2 und 36 einschließlich liegen.

Fmt
Bei Gleitkommakonvertierungen wird das Format der Sequenz der zu konvertierenden Zeichen konvertiert. Weitere Informationen finden Sie unter chars_format .

Hinweise

Die from_chars() Funktionen analysieren die Zeichenfolge [first, last) für ein Zahlenmuster, wobei [first, ) erforderlich ist, lastum ein gültiger Bereich zu sein.

Beim Analysieren von Zeichen wird Leerzeichen nicht ignoriert. Im Gegensatz zum strtod()Beispiel muss der Puffer mit einer gültigen numerischen Darstellung beginnen.

Gibt eine from_chars_result Struktur zurück.

Wenn keine Zeichen mit einem Zahlenmuster übereinstimmen, value ist dies unverändert, from_chars_result.ptr zeigt auf firstund from_chars_result.ec ist errc::invalid_argument.

Wenn nur einige Zeichen einem Zahlenmuster entsprechen, zeigt sie auf das erste Zeichen, from_chars_result.ptr das nicht dem Muster entspricht, oder weist den Wert des last Parameters auf, wenn alle Zeichen übereinstimmen.

Wenn sich der analysierte Wert nicht im Bereich befindet, der durch den Typ von value, value ist unverändert und from_chars_result.ec ist errc::result_out_of_range.

value Andernfalls wird der analysierte Wert nach dem Runden auf den analysierten Wert festgelegt und from_chars_result.ec ist gleich errc{}.

Beispiel

#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;
}

Anforderungen

Header:<charconv>

Namespace: std

/std:c++17 oder höher ist erforderlich.

Siehe auch

<charconv>
Die kürzeste Dezimalzeichenfolge, die Printf()-Formatbezeichner rundet