utility_from_chars

utility_from_chars (문자열을 숫자로 변환하는 함수)

이 페이지는 C++17부터 사용할 수 있는 std::from_chars 함수에 대해 설명해요. 이 함수는 문자 시퀀스를 정수나 부동소수점 값으로 파싱하며, 로케일 독립적이고 할당이 없으며 예외를 던지지 않는 특징이 있어요. 고성능 텍스트 기반 데이터 교환(JSON, XML 등)에 적합해요.

출처: cppreference

본문

헤더 에 정의됨
std :: from_chars_result from_chars ( const char * first , const char * last , /* integer-type */ & value , int base = 10 ); (1) (since C++17) (constexpr since C++23)
std :: from_chars_result from_chars ( const char * first , const char * last , /* floating-point-type */ & value , std :: chars_format fmt = std :: chars_format :: general ); (2) (since C++17)

[ first , last ) 문자 시퀀스에서 아래에 설명된 패턴을 분석해요. 패턴과 일치하는 문자가 없거나, 일치하는 문자를 파싱한 값이 value의 타입으로 표현할 수 없으면 value는 수정되지 않아요. 그 외에는 패턴과 일치하는 문자를 산술 값의 텍스트 표현으로 해석해서 value에 저장해요.

  • base가 16이어도 "0x" 또는 "0X" 접두사는 인식되지 않아요.
  • 마이너스 부호만 인식되고(플러스 부호는 인식되지 않아요), value의 부호 있는 정수 타입에만 허용돼요.
  • 앞쪽 공백은 무시되지 않아요.
  • 지수 부분 외에서는 플러스 부호가 인식되지 않아요(처음에는 마이너스 부호만 허용돼요).
  • fmt에 std::chars_format::scientific이 설정되었지만 std::chars_format::fixed가 설정되지 않은 경우, 지수 부분이 필수예요(그렇지 않으면 선택 사항이에요).
  • fmt에 std::chars_format::fixed가 설정되었지만 std::chars_format::scientific이 설정되지 않은 경우, 선택적 지수는 허용되지 않아요.
  • fmt가 std::chars_format::hex인 경우, "0x" 또는 "0X" 접두사는 허용되지 않아요("0x123" 문자열은 값 "0"으로 파싱되고 나머지 "x123"은 파싱되지 않은 채 남아요).
  • 앞쪽 공백은 무시되지 않아요.

Parameters

first, last - 파싱할 유효한 문자 범위
value - 성공하면 파싱된 값이 저장되는 출력 매개변수
base - 사용할 정수 진법: 2에서 36 사이의 값(포함)
fmt - 사용할 부동소수점 형식, std::chars_format 타입의 비트마스크

Return value

성공하면, ptr이 패턴과 일치하지 않는 첫 번째 문자를 가리키거나, 모든 문자가 일치하면 last와 같은 값을 가지며 ec는 값 초기화된 std::from_chars_result 타입의 값을 반환해요.

패턴이 일치하지 않으면, ptr이 first와 같고 ec가 std::errc::invalid_argument인 std::from_chars_result 타입의 값을 반환해요. value는 수정되지 않아요.

패턴은 일치했지만 파싱된 값이 value의 타입으로 표현 가능한 범위에 없으면, ec가 std::errc::result_out_of_range이고 ptr이 패턴과 일치하지 않는 첫 번째 문자를 가리키는 std::from_chars_result 타입의 값을 반환해요. value는 수정되지 않아요.

Exceptions

아무것도 던지지 않아요.

Notes

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

std::from_chars가 std::to_chars로 형식화된 모든 부동소수점 값을 정확히 복구할 수 있다는 보장은 두 함수가 같은 구현에서 제공될 때만 성립해요.

숫자가 뒤따르지 않는 부호만으로 구성된 패턴은 아무것도 일치하지 않은 패턴으로 취급돼요.

기능 테스트 매크로 표준 기능
__cpp_lib_to_chars 201611L (C++17) 기본 문자열 변환 ( std::from_chars , std::to_chars )
202306L (C++26) 함수의 성공 또는 실패 테스트
__cpp_lib_constexpr_charconv 202207L (C++23) 정수 계열 타입에 대한 std::from_chars 및 std::to_chars 오버로드에 constexpr 한정자 추가

Example

#include <cassert>
#include <charconv>
#include <iomanip>
#include <iostream>
#include <optional>
#include <string_view>
#include <system_error>

int main()
{
    for (std::string_view const str : {"1234", "15 foo", "bar", " 42", "5000000000"})
    {
        std::cout << "String: " << std::quoted(str) << ". ";
        int result{};
        auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), result);

        if (ec == std::errc())
            std::cout << "Result: " << result << ", ptr -> " << std::quoted(ptr) << '\n';
        else if (ec == std::errc::invalid_argument)
            std::cout << "This is not a number.\n";
        else if (ec == std::errc::result_out_of_range)
            std::cout << "This number is larger than an int.\n";
    }

    // C++23's constexpr from_char demo / C++26's operator bool() demo:
    auto to_int = [](std::string_view s) -> std::optional<int>
    {
        int value{};
#if __cpp_lib_to_chars >= 202306L
        if (std::from_chars(s.data(), s.data() + s.size(), value))
#else
        if (std::from_chars(s.data(), s.data() + s.size(), value).ec == std::errc{})
#endif
            return value;
        else
            return std::nullopt;
    };

    assert(to_int("42") == 42);
    assert(to_int("foo") == std::nullopt);
#if __cpp_lib_constexpr_charconv and __cpp_lib_optional >= 202106
    static_assert(to_int("42") == 42);
    static_assert(to_int("foo") == std::nullopt);
#endif
}

Output:

String: "1234". Result: 1234, ptr -> ""
String: "15 foo". Result: 15, ptr -> " foo"
String: "bar". This is not a number.
String: " 42". This is not a number.
String: "5000000000". This number is larger than an int.

Defect reports

다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었어요.

DR 적용 대상 발표된 동작 올바른 동작
LWG 2955 C++17 이 함수는 에 있었고 std::error_code를 사용했어요 로 이동하고 std::errc를 사용해요
LWG 3373 C++17 std::from_chars_result에 추가 멤버가 있을 수 있었어요 추가 멤버는 금지돼요

See also

from_chars_result (C++17) std::from_chars의 반환 타입 (클래스) [edit]
to_chars (C++17) 정수 또는 부동소수점 값을 문자 시퀀스로 변환 (함수) [edit]
stoi stol stoll (C++11) (C++11) (C++11) 문자열을 부호 있는 정수로 변환 (함수) [edit]
stof stod stold (C++11) (C++11) (C++11) 문자열을 부동소수점 값으로 변환 (함수) [edit]
strtol strtoll (C++11) 바이트 문자열을 정수 값으로 변환 (함수) [edit]
strtof strtod strtold 바이트 문자열을 부동소수점 값으로 변환 (함수) [edit]
scanf fscanf sscanf stdin, 파일 스트림 또는 버퍼에서 형식화된 입력을 읽음 (함수) [edit]
operator>> 형식화된 데이터 추출 (std::basic_istream<CharT,Traits>의 공개 멤버 함수) [edit]

더 알아보기 (Learn more)

cppreference