<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 [first
first
, last
last
) ein gültiger Bereich sein muss.
Gibt eine to_chars_result Struktur zurück. Wenn die Konvertierung erfolgreich ist, wie durch to_char_result.ec
sie angegeben, ist das Element ptr
der Einfügezeiger der geschriebenen Zeichen. to_char_result.ec
Andernfalls weist der Wert den Wert errc::value_too_large
aufto_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::fixed
fmt
'e'
, wenn fmt
, ( 'a'
chars_format::scientific
ohne 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 fmt
precision
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 |
Output |
---|---|
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, last
um 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 first
und 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