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 | 이 함수는 |
|
| 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] |