utility_to_chars
utility_to_chars (문자열 변환)
이 페이지는 C++17부터 제공되는 std::to_chars 함수에 대해 설명해요. 이 함수는 정수나 부동소수점 값을 문자열로 변환할 때 사용하며, 로케일 독립적이고 메모리 할당이 없으며 예외를 던지지 않는 특징이 있어요. 고속 텍스트 기반 데이터 교환(JSON, XML 등)에서 특히 유용해요.
출처: cppreference
본문
함수 정의
<charconv> 헤더에 정의되어 있어요.
<charconv> 헤더에 정의됨 |
||
|---|---|---|
std::to_chars_result to_chars(char* first, char* last, /* integer-type */ value, int base = 10); |
(1) | (C++17부터) (C++23부터 constexpr) |
std::to_chars_result to_chars(char*, char*, bool, int = 10) = delete; |
(2) | (C++17부터) |
std::to_chars_result to_chars(char* first, char* last, /* floating-point-type */ value); |
(3) | (C++17부터) |
std::to_chars_result to_chars(char* first, char* last, /* floating-point-type */ value, std::chars_format fmt); |
(4) | (C++17부터) |
std::to_chars_result to_chars(char* first, char* last, /* floating-point-type */ value, std::chars_format fmt, int precision); |
(5) | (C++17부터) |
value를 [first, last) 범위에 연속적으로 채워 문자 문자열로 변환해요. 이때 [first, last)는 유효한 범위여야 해요.
매개변수
| first, last | - | 쓸 문자 범위 |
|---|---|---|
| value | - | 문자열 표현으로 변환할 값 |
| base | - | 사용할 정수 진법: 2에서 36 사이의 값 (포함) |
| fmt | - | 사용할 부동소수점 형식, std::chars_format 타입의 비트마스크 |
| precision | - | 사용할 부동소수점 정밀도 |
반환값
성공하면 ec가 값 초기화된 std::errc와 같고 ptr이 작성된 문자의 바로 다음 위치를 가리키는 std::to_chars_result 타입 값을 반환해요. 문자열은 NUL로 종료되지 않아요.
오류가 발생하면 ec에 std::errc::value_too_large를 담고, ptr에 last 값의 복사본을 담은 std::to_chars_result 타입 값을 반환하며, [first, last) 범위의 내용은 지정되지 않은 상태로 남겨요.
예외
아무것도 던지지 않아요.
참고 사항
C++ 및 C 라이브러리의 다른 형식화 함수들과 달리 std::to_chars는 로케일 독립적이고, 할당을 하지 않으며, 예외를 던지지 않아요. 다른 라이브러리(예: std::sprintf)에서 사용되는 형식화 정책 중 극히 일부만 제공해요. 이는 JSON이나 XML 같은 텍스트 기반 교환에서 흔히 쓰이는 높은 처리량 상황에 유용한 가장 빠른 구현을 가능하게 하기 위한 의도예요.
std::from_chars가 std::to_chars로 형식화된 모든 부동소수점 값을 정확히 복구할 수 있다는 보장은 두 함수가 같은 구현에서 제공될 때만 성립해요.
bool 값을 "0"/"1"로 형식화하려면 다른 정수 타입으로 명시적으로 캐스팅해야 해요.
기능 테스트 매크로
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_to_chars |
201611L | (C++17) | 기본 문자열 변환 (std::to_chars, std::from_chars) |
| 202306L | (C++26) | <charconv> 함수의 성공 또는 실패 테스트 |
|
__cpp_lib_constexpr_charconv |
202207L | (C++23) | 정수 계열에 대한 std::to_chars 및 std::from_chars 오버로드(1)에 constexpr 한정자 추가 |
예제
#include <charconv>
#include <iomanip>
#include <iostream>
#include <string_view>
#include <system_error>
void show_to_chars(auto... format_args)
{
const size_t buf_size = 10;
char buf[buf_size]{};
std::to_chars_result result = std::to_chars(buf, buf + buf_size, format_args...);
if (result.ec != std::errc())
std::cout << std::make_error_code(result.ec).message() << '\n';
else
{
std::string_view str(buf, result.ptr - buf);
std::cout << std::quoted(str) << '\n';
}
}
int main()
{
show_to_chars(42);
show_to_chars(+3.14159F);
show_to_chars(-3.14159, std::chars_format::fixed);
show_to_chars(-3.14159, std::chars_format::scientific, 3);
show_to_chars(3.1415926535, std::chars_format::fixed, 10);
}
가능한 출력:
"42"
"3.14159"
"-3.14159"
"-3.142e+00"
Value too large for defined data type
결함 보고서
다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었어요.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2955 | C++17 | 이 함수는 <utility>에 있었고 std::error_code를 사용했어요 |
<charconv>로 이동하고 std::errc를 사용해요 |
| LWG 3266 | C++17 | bool 인수가 허용되고 int로 승격되었어요 |
삭제된 오버로드로 거부해요 |
| LWG 3373 | C++17 | std::to_chars_result가 추가 멤버를 가질 수 있었어요 |
추가 멤버는 허용되지 않아요 |
같이 보기
to_chars_result (C++17) |
std::to_chars의 반환 타입 (클래스) [편집] |
|---|---|
from_chars (C++17) |
문자 시퀀스를 정수 또는 부동소수점 값으로 변환 (함수) [편집] |
to_string (C++11) |
정수 또는 부동소수점 값을 문자열로 변환 (함수) [편집] |
printf fprintf sprintf snprintf (C++11) |
stdout, 파일 스트림 또는 버퍼에 형식화된 출력을 출력 (함수) [편집] |
operator<< |
형식화된 데이터를 삽입 (std::basic_ostream<CharT,Traits>의 공개 멤버 함수) [편집] |