std:: from_chars
|
헤더 파일에 정의됨
<charconv>
|
||
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(1) |
(C++17부터)
(C++23부터 constexpr) |
|
std
::
from_chars_result
from_chars
(
const
char
*
first,
const
char
*
last,
|
(2) | (C++17부터) |
아래에 설명된 패턴에 대해 문자 시퀀스
[
first
,
last
)
를 분석합니다. 패턴과 일치하는 문자가 없거나, 파싱된 문자가 나타내는 값이
value
의 타입으로 표현 불가능한 경우
value
는 수정되지 않습니다. 그렇지 않으면 패턴과 일치하는 문자들은 산술 값의 텍스트 표현으로 해석되어
value
에 저장됩니다.
- "0x" 또는 "0X" 접두사는 base 가 16인 경우 인식되지 않음
- 마이너스 기호만 인식됨(플러스 기호는 인식되지 않음), 그리고 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" 은 파싱되지 않음) - 선행 공백이 무시되지 않음.
목차 |
매개변수
| 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
에 추가 멤버가 있을 수 있음
|
추가 멤버는 금지됨 |
참고 항목
|
(C++17)
|
std::from_chars
의 반환 타입
(클래스) |
|
(C++17)
|
정수 또는 부동소수점 값을 문자 시퀀스로 변환
(함수) |
|
(C++11)
(C++11)
(C++11)
|
문자열을 부호 있는 정수로 변환
(함수) |
|
(C++11)
(C++11)
(C++11)
|
문자열을 부동소수점 값으로 변환
(함수) |
|
(C++11)
|
바이트 문자열을 정수 값으로 변환
(함수) |
|
바이트 문자열을 부동소수점 값으로 변환
(함수) |
|
|
stdin
, 파일 스트림 또는 버퍼에서 형식화된 입력을 읽음
(함수) |
|
|
형식화된 데이터를 추출
(
std::basic_istream<CharT,Traits>
의 public 멤버 함수)
|