<charconv>
함수
<charconv> 헤더에는 다음과 같은 비 멤버 함수가 포함됩니다.
비 멤버 함수 | 설명 |
---|---|
to_chars | 정수 또는 부동 소수점 값을 시 char 퀀스로 변환합니다. |
from_chars | 시퀀스를 char 정수 또는 부동 소수점 값으로 변환합니다. |
이러한 변환 함수는 성능을 위해 조정되며 가장 짧은 왕복 동작도 지원합니다. 가장 짧은 왕복 동작은 숫자가 문자로 변환되는 경우 해당 문자를 부동 소수점으로 다시 변환할 때 원래 숫자를 복구할 수 있도록 충분한 정밀도만 기록되는 것을 의미합니다.
- 문자를 숫자로 변환할 때 숫자 값은 null로 종료될 필요가 없습니다. 마찬가지로 숫자를 문자로 변환할 때 결과는 null로 종료되지 않습니다.
- 변환 함수는 메모리를 할당하지 않습니다. 모든 경우에 버퍼를 소유합니다.
- 변환 함수는 throw되지 않습니다. 변환이 성공했는지 확인할 수 있는 결과가 반환됩니다.
- 변환 함수는 런타임 반올림 모드에 민감하지 않습니다.
- 변환 함수는 로캘을 인식하지 않습니다. 쉼표로 사용하는 로캘의 경우 항상 소수점을
'.'
''로 인쇄하고 구문 분석하지 않습니다.
to_chars
정수 또는 부동 소수점 값을 시 char
퀀스로 변환합니다.
value
범위 [, 여기서 [first
first
, last
last
)가 유효한 범위여야 하므로 문자열로 변환합니다.
to_chars_result 구조를 반환합니다. 표시된 대로 변환에 성공하면 멤버 ptr
는 기록된 to_char_result.ec
문자의 마지막 1개 포인터입니다. 그렇지 않으면 to_char_result.ec
값 errc::value_too_large
이 있고 값 to_char_result.ptr
이 last
있으며 범위 [first
, last
)의 내용이 지정되지 않습니다.
실패할 수 있는 to_chars
유일한 방법은 결과를 저장할 수 없는 큰 버퍼를 제공하는 것입니다.
// 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);
매개 변수
first
채울 버퍼의 시작을 가리킵니다.
last
채울 버퍼의 끝을 지나 1개의 문자를 가리킵니다.
value
변환할 값입니다. 음수이면 value
표현이 .로 -
시작됩니다.
base
정수 변환의 경우 문자로 변환 value
할 때 사용할 기준입니다. 2에서 36 사이여야 합니다. 앞에 오는 0은 없습니다. 범위 10..35(포함)의 숫자는 소문자 a.로 표시됩니다. z
fmt
부동 소수점 변환의 경우 과학, 고정 또는 16진수와 같이 사용할 변환 형식을 지정하는 비트 마스크입니다. 자세한 내용은 chars_format 참조하세요.
전체 자릿수
부동 소수점 변환의 경우 변환된 값의 전체 자릿수입니다.
반환 값
설명
chars_format 매개 변수를 사용하는 함수는 다음과 같이 printf()
변환 지정자를 결정합니다. 변환 지정자는 'f'
if is, if fmt
chars_format::fixed
fmt
ischars_format::scientific
, 'e'
'a'
(결과에 선행 0x
이 없는 경우) if fmt
ischars_format::hex
, 'g'
if fmt
입니다.chars_format::general
가장 짧은 고정 표기법을 지정하면 값이 매우 크거나 매우 작은 경우 가능한 가장 짧은 표현일 수 있으므로 출력이 길어질 수 있습니다.
다음 표에서는 다양한 조합과 precision
매개 변수를 사용하여 변환 동작을 설명합니다fmt
. "최단 왕복 동작"이라는 용어는 해당 from_chars
함수를 사용하여 해당 표현을 구문 분석하면 값을 정확하게 복구하도록 필요한 가장 적은 수의 숫자를 작성하는 것을 의미합니다.
fmt 및 precision 조합 |
출력 |
---|---|
Neither | 고정 또는 과학적 표기법 중 어느 것이든 더 짧으며, 타이브레이커로 고정되는 것을 선호합니다. 이 동작은 매개 변수를 사용하는 fmt 오버로드로 시뮬레이션할 수 없습니다. |
fmt |
가장 짧은 과학적 형식과 같이 지정된 형식에 대한 가장 짧은 왕복 동작입니다. |
fmt 및 precision |
가장 짧은 왕복 동작 없이 지정된 전체 자릿수(다음 printf() 스타일)를 사용합니다. |
예시
#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
시퀀스를 char
정수 또는 부동 소수점 값으로 변환합니다.
// 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);
매개 변수
first
변환할 문자 버퍼의 시작을 가리킵니다.
last
변환할 문자 버퍼의 끝 요소를 하나 지나서 가리킵니다.
value
변환에 성공하면 변환 결과가 포함됩니다.
base
정수 변환의 경우 변환 중에 사용할 기준입니다. 2에서 36 사이여야 합니다.
fmt
부동 소수점 변환의 경우 변환되는 문자 시퀀스의 형식입니다. 자세한 내용은 chars_format 참조하세요.
설명
함수는 from_chars()
숫자 패턴에 대해 문자열 [first
, last
)를 분석합니다. 여기서 [first
, last
)는 유효한 범위여야 합니다.
문자를 구문 분석할 때 공백은 무시되지 않습니다. strtod()
예를 들어 버퍼는 유효한 숫자 표현으로 시작해야 합니다.
from_chars_result 구조를 반환합니다.
숫자 패턴 value
과 일치하는 문자가 없으면 수정 from_chars_result.ptr
되지 않고 가리킨 first
다음 입니다errc::invalid_argument
from_chars_result.ec
.
일부 문자만 숫자 패턴과 일치하거나, from_chars_result.ptr
패턴과 일치하지 않는 첫 번째 문자를 가리키거나, 모든 문자가 일치하는 경우 매개 변수 값을 last
갖습니다.
구문 분석된 값이 형식으로 value
value
나타낼 수 있는 범위에 없으면 수정되지 from_chars_result.ec
않으며 다음과 같습니다errc::result_out_of_range
.
그렇지 않으면 value
반올림 후 구문 분석된 값으로 설정되며 from_chars_result.ec
같 errc{}
음입니다.
예시
#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;
}
요구 사항
헤더:<charconv>
네임스페이스: std
/std:c++17
이상이 필요합니다.