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로 종료되지 않아요.

오류가 발생하면 ecstd::errc::value_too_large를 담고, ptrlast 값의 복사본을 담은 std::to_chars_result 타입 값을 반환하며, [first, last) 범위의 내용은 지정되지 않은 상태로 남겨요.

예외

아무것도 던지지 않아요.

참고 사항

C++ 및 C 라이브러리의 다른 형식화 함수들과 달리 std::to_chars는 로케일 독립적이고, 할당을 하지 않으며, 예외를 던지지 않아요. 다른 라이브러리(예: std::sprintf)에서 사용되는 형식화 정책 중 극히 일부만 제공해요. 이는 JSON이나 XML 같은 텍스트 기반 교환에서 흔히 쓰이는 높은 처리량 상황에 유용한 가장 빠른 구현을 가능하게 하기 위한 의도예요.

std::from_charsstd::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_charsstd::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>의 공개 멤버 함수) [편집]

더 알아보기 (Learn more)

cppreference