Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Nagłówek <charconv> zawiera następujące funkcje inne niż składowe:
| Funkcje inne niż składowe | Opis |
|---|---|
| to_chars | Przekonwertuj wartość całkowitą lub zmiennoprzecinkową na sekwencję char. |
| from_chars | Przekonwertuj char sekwencję na liczbę całkowitą lub wartość zmiennoprzecinkową. |
Te funkcje konwersji są dostrojone pod kątem wydajności, a także obsługują zachowanie najkrótszej rundy. Zachowanie najkrótszej rundy oznacza, że gdy liczba jest konwertowana na znaki, jest zapisywana wystarczająca precyzja, aby umożliwić odzyskanie oryginalnej liczby podczas konwertowania tych znaków z powrotem na zmiennoprzecinkowe.
- Podczas konwertowania znaków na liczbę wartość liczbowa nie musi być zakończona wartością null. Podobnie podczas konwertowania liczby na znaki wynik nie kończy się wartością null.
- Funkcje konwersji nie przydzielają pamięci. Jesteś właścicielem buforu we wszystkich przypadkach.
- Funkcje konwersji nie są zwracane. Zwracany jest wynik, z którego można określić, czy konwersja zakończyła się pomyślnie.
- Funkcje konwersji nie są poufne w trybie zaokrąglania w czasie wykonywania.
- Funkcje konwersji nie są świadome ustawień regionalnych. Zawsze drukują i analizują punkty dziesiętne jako
'.', i nigdy nie są "", dla ustawień regionalnych, które używają przecinków.
to_chars
Przekonwertuj wartość całkowitą lub zmiennoprzecinkową na sekwencję char.
Konwertuje value na ciąg znaków, wypełniając zakres [first, last), gdzie [first, last) musi być prawidłowym zakresem.
Zwraca strukturę to_chars_result. Jeśli konwersja zakończy się pomyślnie, jak wskazano w to_char_result.ecelemencie , element członkowski ptr jest wskaźnikiem jeden-przeszłości-end znaków zapisanych. to_char_result.ec W przeciwnym razie ma wartość errc::value_too_large, ma wartość last, to_char_result.ptr a zawartość zakresu [first, last) są nieokreślone.
Jedynym sposobem, w jaki to_chars może zakończyć się niepowodzenie, jest podanie niewystarczająco dużego buforu do przechowywania wyniku.
// 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
pierwszy
Wskazuje początek buforu do wypełnienia.
ostatni
Wskazuje jeden znak obok końca buforu do wypełnienia.
wartość
Wartość do konwersji. Jeśli value jest ujemna, reprezentacja zaczyna się od -.
base
W przypadku konwersji liczb całkowitych baza do użycia podczas konwertowania value na znaki. Musi należeć do przedziału od 2 do 36 włącznie. Nie będzie zer wiodących. Cyfry w zakresie 10..35 (włącznie) są reprezentowane jako małe litery a.. z
Fmt
W przypadku konwersji zmiennoprzecinkowych maska bitowa określająca format konwersji do użycia, taki jak naukowy, stały lub szesnastkowy. Aby uzyskać szczegółowe informacje, zobacz chars_format .
precyzja
W przypadku konwersji zmiennoprzecinkowych liczba cyfr precyzji dla przekonwertowanej wartości.
Wartość zwracana
To_chars_result zawierający wynik konwersji.
Uwagi
Funkcje używające parametru chars_format określają specyfikator konwersji tak, jakby były używane printf() w następujący sposób: specyfikator konwersji jest, jeśli fmt ma chars_format::fixed'f' wartość , jeśli fmt ma 'a' chars_format::scientificwartość , 'e' (bez wiodącego 0x w wyniku), jeśli ma wartość , a 'g' jeśli fmt fmt ma chars_format::hexchars_format::generalwartość . Określenie najkrótszej stałej notacji może nadal powodować długie dane wyjściowe, ponieważ może to być najkrótsza możliwa reprezentacja, gdy wartość jest bardzo duża lub bardzo mała.
W poniższej tabeli opisano zachowanie konwersji, biorąc pod uwagę różne kombinacje parametrów fmt i precision . Termin "zachowanie najkrótszej rundy" odnosi się do pisania najmniejszej liczby cyfr niezbędnych, tak aby analizowanie tej reprezentacji przy użyciu odpowiedniej from_chars funkcji dokładnie odzyskało wartość.
fmt i precision kombinacja |
Wyjście |
|---|---|
| Żadna | Niezależnie od stałej lub naukowej notacji jest krótszy, preferując stały jako tiebreaker. Tego zachowania nie można symulować przez żadne przeciążenie, które przyjmuje fmt parametr . |
fmt |
Najkrótsze zachowanie dwukierunkowe dla określonego formatu, takie jak najkrótszy format naukowy. |
fmt i precision |
Używa podanej precyzji, następującego printf() stylu, bez najkrótszego zachowania w obie strony. |
Przykład
#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
Przekonwertuj char sekwencję na liczbę całkowitą lub wartość zmiennoprzecinkową.
// 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
pierwszy
Wskazuje początek buforu znaków do konwersji.
ostatni
Wskazuje jeden obok elementu końcowego buforu znaków do konwersji.
wartość
Jeśli konwersja zakończy się pomyślnie, zawiera wynik konwersji.
base
W przypadku konwersji liczb całkowitych podstawa do użycia podczas konwersji. Musi należeć do przedziału od 2 do 36 włącznie.
Fmt
W przypadku konwersji zmiennoprzecinkowych format sekwencji konwertowanych znaków. Aby uzyskać szczegółowe informacje, zobacz chars_format .
Uwagi
Funkcje from_chars() analizują ciąg [first, last) dla wzorca liczbowego, gdzie [first, last) jest wymagany do prawidłowego zakresu.
Podczas analizowania znaków odstępy nie są ignorowane. W przeciwieństwie do strtod()funkcji , na przykład bufor musi zaczynać się od prawidłowej reprezentacji liczbowej.
Zwraca strukturę from_chars_result.
Jeśli żaden znak nie jest zgodny ze wzorcem liczbowym, value jest niezmodyfikowany, from_chars_result.ptr wskazuje wartość firsti from_chars_result.ec ma wartość errc::invalid_argument.
Jeśli tylko niektóre znaki pasują do wzorca liczbowego, from_chars_result.ptr wskazuje pierwszy znak, który nie pasuje do wzorca, lub ma wartość parametru last , jeśli wszystkie znaki są zgodne.
Jeśli przeanalizowana wartość nie znajduje się w zakresie reprezentowanym przez typ value, value jest niezmodyfikowana i from_chars_result.ec ma wartość errc::result_out_of_range.
value W przeciwnym razie jest ustawiona wartość przeanalizowana po zaokrągleniu i from_chars_result.ec jest równa errc{}.
Przykład
#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;
}
Wymagania
Nagłówek:<charconv>
Przestrzeń nazw: std
/std:c++17 lub nowszy jest wymagany.
Zobacz też
<charconv>
Najkrótszy ciąg dziesiętny, który specyfikatory formatu printf() round-trips