std:: from_chars
|
Definiert im Header
<charconv>
|
||
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(1) |
(seit C++17)
(constexpr seit C++23) |
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(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.
- "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.
- Das Pluszeichen wird außerhalb des Exponenten nicht erkannt (nur das Minuszeichen am Anfang ist erlaubt)
-
Wenn
fmtstd::chars_format::scientific gesetzt hat, aber nicht std::chars_format::fixed , ist der Exponententeil erforderlich (ansonsten optional) -
Wenn
fmtstd::chars_format::fixed gesetzt hat, aber nicht std::chars_format::scientific , ist der optionale Exponent nicht erlaubt -
Wenn
fmtstd::chars_format::hex ist, sind die Präfixe "0x" oder "0X" nicht erlaubt (die Zeichenkette "0x123" wird als Wert "0" mit nicht verarbeitetem Rest "x123" geparst) - Führende Leerzeichen werden nicht ignoriert.
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
|
(C++17)
|
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) |
|
(C++11)
|
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>
)
|