Namespaces
Variants

std:: from_chars

From cppreference.net
Definiert im Header <charconv>
std :: from_chars_result

from_chars ( const char * first, const char * last,

/* integer-type */ & value, int base = 10 ) ;
(1) (seit C++17)
(constexpr seit C++23)
std :: from_chars_result

from_chars ( const char * first, const char * last,
/* floating-point-type */ & value,

std:: chars_format fmt = std :: chars_format :: general ) ;
(2) (seit C++17)

Analysiert die Zeichensequenz [ first , last ) nach einem unten beschriebenen Muster. Wenn keine Zeichen dem Muster entsprechen oder wenn der durch Parsen der übereinstimmenden Zeichen erhaltene Wert nicht im Typ von value darstellbar ist, wird value unverändert gelassen, andernfalls werden die dem Muster entsprechenden Zeichen als Textdarstellung eines arithmetischen Werts interpretiert, der in value gespeichert wird.

1) Integer-Parser: Erwarten das Muster identisch zu dem von std::strtol in der Standard-("C")-Lokalisierung und der gegebenen nicht-null numerischen Basis verwendetem, außer dass
  • "0x" oder "0X" Präfixe nicht erkannt werden, wenn base 16 ist
  • nur das Minuszeichen erkannt wird (nicht das Pluszeichen), und nur für vorzeichenbehaftete Integer-Typen von value
  • führende Leerzeichen nicht ignoriert werden.
Die Bibliothek stellt Überladungen für alle cv-unqualifizierten (seit C++23) vorzeichenbehafteten und vorzeichenlosen Integer-Typen und char als Referenztyp des Parameters value bereit.
2) Gleitkomma-Parser: Erwartet das gleiche Muster wie von std::strtod in der Standard-Lokale ("C") verwendet, mit folgenden Ausnahmen:
In jedem Fall ist der resultierende Wert einer von höchstens zwei Gleitkommawerten, die dem Wert der Zeichenkette entsprechen, die dem Muster entspricht, nach Rundung gemäß std::round_to_nearest .
Die Bibliothek bietet Überladungen für alle cv-unqualifizierten Standard (bis C++23) Gleitkommatypen als Referenztyp des Parameters value an.

Inhaltsverzeichnis

Parameter

first, last - Gültiger Zeichenbereich zum Parsen
value - Der Out-Parameter, in dem der geparste Wert bei Erfolg gespeichert wird
base - Zu verwendende Integer-Basis: ein Wert zwischen 2 und 36 (inklusive).
fmt - Zu verwendende Gleitkomma-Formatierung, eine Bitmaske vom Typ std::chars_format

Rückgabewert

Bei Erfolg gibt einen Wert vom Typ std::from_chars_result zurück, sodass ptr auf das erste Zeichen zeigt, das nicht zum Muster passt, oder den Wert gleich last hat, wenn alle Zeichen übereinstimmen und ec wertinitialisiert ist.

Wenn keine Übereinstimmung mit dem Muster vorliegt, wird ein Wert vom Typ std::from_chars_result zurückgegeben, sodass ptr gleich first ist und ec gleich std::errc::invalid_argument ist. value bleibt unverändert.

Wenn das Muster übereinstimmte, aber der geparste Wert nicht im darstellbaren Bereich des Typs von value liegt, wird ein Wert vom Typ std::from_chars_result zurückgegeben, sodass ec gleich std::errc::result_out_of_range ist und ptr auf das erste Zeichen zeigt, das nicht mit dem Muster übereinstimmt. value bleibt unverändert.

Exceptions

Wirft nichts.

Hinweise

Im Gegensatz zu anderen Parsing-Funktionen in C++- und C-Bibliotheken ist std::from_chars lokaleunabhängig, nicht-allozierend und nicht-werfend. Nur eine kleine Teilmenge der Parsing-Richtlinien, die von anderen Bibliotheken verwendet werden (wie std::sscanf ), wird bereitgestellt. Dies soll die schnellstmögliche Implementierung ermöglichen, die in gängigen Hochdurchsatz-Kontexten nützlich ist, wie z.B. textbasierter Austausch ( JSON oder XML ).

Die Garantie, dass std::from_chars jeden Gleitkommawert, der von std::to_chars formatiert wurde, exakt wiederherstellen kann, gilt nur, wenn beide Funktionen aus derselben Implementierung stammen.

Ein Muster, das aus einem Zeichen ohne nachfolgende Ziffern besteht, wird als Muster behandelt, das nichts Übereinstimmendes gefunden hat.

Feature-Test Makro Wert Std Feature
__cpp_lib_to_chars 201611L (C++17) Elementare String-Konvertierungen ( std::from_chars , std::to_chars )
202306L (C++26) Testen auf Erfolg oder Misserfolg von <charconv> Funktionen
__cpp_lib_constexpr_charconv 202207L (C++23) Hinzufügen von constexpr Modifikatoren zu std::from_chars und std::to_chars Überladungen für integrale Typen

Beispiel

#include <cassert>
#include <charconv>
#include <iomanip>
#include <iostream>
#include <optional>
#include <string_view>
#include <system_error>
int main()
{
    for (std::string_view const str : {"1234", "15 foo", "bar", " 42", "5000000000"})
    {
        std::cout << "String: " << std::quoted(str) << ". ";
        int result{};
        auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), result);
        if (ec == std::errc())
            std::cout << "Result: " << result << ", ptr -> " << std::quoted(ptr) << '\n';
        else if (ec == std::errc::invalid_argument)
            std::cout << "This is not a number.\n";
        else if (ec == std::errc::result_out_of_range)
            std::cout << "This number is larger than an int.\n";
    }
    // C++23's constexpr from_char demo / C++26's operator bool() demo:
    auto to_int = [](std::string_view s) -> std::optional<int>
    {
        int value{};
#if __cpp_lib_to_chars >= 202306L
        if (std::from_chars(s.data(), s.data() + s.size(), value))
#else
        if (std::from_chars(s.data(), s.data() + s.size(), value).ec == std::errc{})
#endif
            return value;
        else
            return std::nullopt;
    };
    assert(to_int("42") == 42);
    assert(to_int("foo") == std::nullopt);
#if __cpp_lib_constexpr_charconv and __cpp_lib_optional >= 202106
    static_assert(to_int("42") == 42);
    static_assert(to_int("foo") == std::nullopt);
#endif
}

Ausgabe:

String: "1234". Result: 1234, ptr -> ""
String: "15 foo". Result: 15, ptr -> " foo"
String: "bar". This is not a number.
String: " 42". This is not a number.
String: "5000000000". This number is larger than an int.

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2955 C++17 diese Funktion war in <utility> und verwendete std::error_code verschoben nach <charconv> und verwendet std::errc
LWG 3373 C++17 std::from_chars_result könnte zusätzliche Member haben zusätzliche Member sind verboten

Siehe auch

der Rückgabetyp von std::from_chars
(Klasse)
(C++17)
konvertiert einen Integer- oder Fließkommawert in eine Zeichenfolge
(Funktion)
(C++11) (C++11) (C++11)
konvertiert einen String in einen vorzeichenbehafteten Integer
(Funktion)
(C++11) (C++11) (C++11)
konvertiert einen String in einen Fließkommawert
(Funktion)
konvertiert einen Byte-String in einen Integerwert
(Funktion)
konvertiert einen Byte-String in einen Fließkommawert
(Funktion)
liest formatierten Input von stdin , einem Dateistream oder einem Buffer
(Funktion)
extrahiert formatierte Daten
(öffentliche Member-Funktion von std::basic_istream<CharT,Traits> )