Namespaces
Variants

std:: from_chars

From cppreference.net
헤더 파일에 정의됨 <charconv>
std :: from_chars_result

from_chars ( const char * first, const char * last,

/* integer-type */ & value, int base = 10 ) ;
(1) (C++17부터)
(C++23부터 constexpr)
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) (C++17부터)

아래에 설명된 패턴에 대해 문자 시퀀스 [ first , last ) 를 분석합니다. 패턴과 일치하는 문자가 없거나, 파싱된 문자가 나타내는 값이 value 의 타입으로 표현 불가능한 경우 value 는 수정되지 않습니다. 그렇지 않으면 패턴과 일치하는 문자들은 산술 값의 텍스트 표현으로 해석되어 value 에 저장됩니다.

1) 정수 파서: 기본("C") 로케일과 주어진 0이 아닌 숫자 기수에서 std::strtol 이 사용하는 패턴과 동일한 패턴을 기대합니다. 단, 다음 사항은 제외됩니다:
  • "0x" 또는 "0X" 접두사는 base 가 16인 경우 인식되지 않음
  • 마이너스 기호만 인식됨(플러스 기호는 인식되지 않음), 그리고 value 의 부호 있는 정수 타입에 대해서만 적용됨
  • 앞쪽 공백 문자는 무시되지 않음
라이브러리는 cv-unqualified (since C++23) 모든 부호 있는 및 부호 없는 정수 타입과 char 에 대한 오버로드를 매개변수 value 의 참조 타입으로 제공합니다.
2) 부동 소수점 파서: 기본("C") 로케일에서 std::strtod 가 사용하는 패턴과 동일한 패턴을 기대합니다. 단, 다음 예외가 적용됩니다:
  • 지수 부분 외부에서는 플러스 기호가 인식되지 않음 (시작 부분에서는 마이너스 기호만 허용됨)
  • 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" 은 파싱되지 않음)
  • 선행 공백이 무시되지 않음.
어떤 경우든, 결과 값은 문자열의 값과 패턴이 일치하는 값 중에서 최대 두 개의 부동 소수점 값 중 하나이며, std::round_to_nearest 에 따라 반올림된 후의 값입니다.
이 라이브러리는 모든 cv-비한정 표준 (C++23까지) 부동소수점 타입들에 대해 매개변수 value 의 참조 타입으로 오버로드를 제공합니다.

목차

매개변수

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

반환값

성공 시, std::from_chars_result 타입의 값을 반환하며, ptr 은 패턴과 일치하지 않는 첫 번째 문자를 가리키거나, 모든 문자가 일치하는 경우 last 값과 같으며 ec 는 값 초기화된 상태입니다.

패턴이 일치하지 않으면, std::from_chars_result 타입의 값을 반환하며, ptr first 와 같고 ec std::errc::invalid_argument 와 같은 값을 가집니다. value 는 수정되지 않습니다.

패턴이 일치했지만 파싱된 값이 value 의 타입으로 표현 가능한 범위를 벗어난 경우, std::from_chars_result 타입의 값을 반환하며, 이때 ec std::errc::result_out_of_range 와 같고 ptr 는 패턴과 일치하지 않는 첫 번째 문자를 가리킵니다. value 는 수정되지 않습니다.

예외

아무것도 던지지 않습니다.

참고 사항

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) <charconv> 함수의 성공 또는 실패 테스트
__cpp_lib_constexpr_charconv 202207L (C++23) 정수형에 대한 std::from_chars std::to_chars 오버로드에 constexpr 수식어 추가

예제

#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의 constexpr from_char 데모 / C++26의 operator bool() 데모:
    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
}

출력:

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.

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2955 C++17 이 함수는 <utility> 헤더에 있었고 std::error_code 를 사용함 <charconv> 로 이동되었고 std::errc 를 사용함
LWG 3373 C++17 std::from_chars_result 에 추가 멤버가 있을 수 있음 추가 멤버는 금지됨

참고 항목

std::from_chars 의 반환 타입
(클래스)
(C++17)
정수 또는 부동소수점 값을 문자 시퀀스로 변환
(함수)
(C++11) (C++11) (C++11)
문자열을 부호 있는 정수로 변환
(함수)
(C++11) (C++11) (C++11)
문자열을 부동소수점 값으로 변환
(함수)
바이트 문자열을 정수 값으로 변환
(함수)
바이트 문자열을 부동소수점 값으로 변환
(함수)
stdin , 파일 스트림 또는 버퍼에서 형식화된 입력을 읽음
(함수)
형식화된 데이터를 추출
( std::basic_istream<CharT,Traits> 의 public 멤버 함수)