basic_string_stol
basic_string_stol (문자열을 부호 있는 정수로 변환하는 함수)
이 페이지에서는 C++11부터 제공되는 std::stoi, std::stol, std::stoll 함수에 대해 설명해요. 이 함수들은 std::string이나 std::wstring 문자열을 파싱해서 부호 있는 정수 값으로 변환해 주는 표준 라이브러리 함수들이에요. 문자열 앞부분에서 공백을 무시하고 유효한 정수 표현을 읽어 들인 뒤 그 값을 반환해요.
출처: cppreference
본문
함수 정의
다음은 <string> 헤더에 정의된 함수들의 목록이에요.
<string> 헤더에 정의됨 |
||
|---|---|---|
int stoi ( const std :: string & str , std :: size_t * pos = nullptr , int base = 10 ); |
(1) | (C++11부터) |
int stoi ( const std :: wstring & str , std :: size_t * pos = nullptr , int base = 10 ); |
(2) | (C++11부터) |
long stol ( const std :: string & str , std :: size_t * pos = nullptr , int base = 10 ); |
(3) | (C++11부터) |
long stol ( const std :: wstring & str , std :: size_t * pos = nullptr , int base = 10 ); |
(4) | (C++11부터) |
long long stoll ( const std :: string & str , std :: size_t * pos = nullptr , int base = 10 ); |
(5) | (C++11부터) |
long long stoll ( const std :: wstring & str , std :: size_t * pos = nullptr , int base = 10 ); |
(6) | (C++11부터) |
동작 방식
이 함수들은 문자열 str에서 부호 있는 정수 값을 해석해요. 내부적으로 변환 함수에 사용되는 포인터 ptr은 (1), (3), (5)에서는 char* 타입이고, (2), (4), (6)에서는 wchar_t* 타입이에요.
먼저 std::isspace를 호출해서 식별되는 공백 문자들을 첫 번째 비공백 문자가 나올 때까지 모두 버려요. 그런 다음 가능한 한 많은 문자를 사용해 유효한 base진법(여기서 base는 n) 정수 표현을 만들고, 그 값을 정수로 변환해요. 유효한 정수 값은 다음 부분들로 구성돼요.
- (선택) 더하기 또는 빼기 부호
- (선택) 8진법을 나타내는 접두사
0(base가 8 또는 0일 때만 적용) - (선택) 16진법을 나타내는 접두사
0x또는0X(base가 16 또는 0일 때만 적용) - 숫자들의 연속
base에 유효한 값의 집합은 {0, 2, 3, ..., 36}이에요. base가 2인 정수의 유효한 숫자는 {0, 1}이고, base가 3이면 {0, 1, 2}이며, 이런 식으로 계속돼요. base가 10보다 크면 알파벳 문자도 유효한 숫자에 포함되는데, base가 11일 때 Aa부터 시작해서 base가 36일 때 Zz까지 사용돼요. 문자의 대소문자는 구분하지 않아요.
현재 설치된 C 로케일에 따라 추가적인 숫자 형식이 허용될 수도 있어요.
base 값이 0이면 숫자 체계가 자동으로 감지돼요. 접두사가 0이면 8진법, 접두사가 0x 또는 0X이면 16진법, 그 외에는 10진법으로 처리해요.
입력 시퀀스에 빼기 부호가 포함되어 있으면, 숫자 시퀀스로 계산된 값은 결과 타입에서 단항 마이너스 연산을 적용한 것처럼 부호가 반전돼요.
pos가 널 포인터가 아니면, ptr은 str.c_str()에서 변환되지 않은 첫 번째 문자의 주소를 받게 돼요. 그리고 그 문자의 인덱스가 계산되어 *pos에 저장되는데, 이는 변환으로 처리된 문자의 수를 의미해요.
매개변수
str |
- | 변환할 문자열 |
|---|---|---|
pos |
- | 처리된 문자 수를 저장할 정수의 주소 |
base |
- | 숫자 체계(진법) |
반환값
str의 내용에 해당하는 정수 값을 반환해요.
예외
- 변환이 전혀 수행될 수 없으면
std::invalid_argument를 던져요. - 변환된 값이 결과 타입의 범위를 벗어나거나, 내부 함수(
std::strtol또는std::strtoll)가errno를ERANGE로 설정하면std::out_of_range를 던져요.
예제
#include <iomanip>
#include <iostream>
#include <stdexcept>
#include <string>
#include <utility>
int main()
{
const auto data =
{
"45",
"+45",
" -45",
"3.14159",
"31337 with words",
"words and 2",
"12345678901",
};
for (const std::string s : data)
{
std::size_t pos{};
try
{
std::cout << "std::stoi(" << std::quoted(s) << "): ";
const int i{std::stoi(s, &pos)};
std::cout << i << "; pos: " << pos << '\n';
}
catch (std::invalid_argument const& ex)
{
std::cout << "std::invalid_argument::what(): " << ex.what() << '\n';
}
catch (std::out_of_range const& ex)
{
std::cout << "std::out_of_range::what(): " << ex.what() << '\n';
const long long ll{std::stoll(s, &pos)};
std::cout << "std::stoll(" << std::quoted(s) << "): " << ll
<< "; pos: " << pos << '\n';
}
}
std::cout << "\nCalling with different radixes:\n";
for (const auto& [s, base] : {std::pair<const char*, int>
{"11", 2}, {"22", 3}, {"33", 4}, {"77", 8},
{"99", 10}, {"FF", 16}, {"jJ", 20}, {"Zz", 36}})
{
const int i{std::stoi(s, nullptr, base)};
std::cout << "std::stoi(" << std::quoted(s)
<< ", nullptr, " << base << "): " << i << '\n';
}
}
가능한 출력 결과는 다음과 같아요.
std::stoi("45"): 45; pos: 2
std::stoi("+45"): 45; pos: 3
std::stoi(" -45"): -45; pos: 4
std::stoi("3.14159"): 3; pos: 1
std::stoi("31337 with words"): 31337; pos: 5
std::stoi("words and 2"): std::invalid_argument::what(): stoi
std::stoi("12345678901"): std::out_of_range::what(): stoi
std::stoll("12345678901"): 12345678901; pos: 11
Calling with different radixes:
std::stoi("11", nullptr, 2): 3
std::stoi("22", nullptr, 3): 8
std::stoi("33", nullptr, 4): 15
std::stoi("77", nullptr, 8): 63
std::stoi("99", nullptr, 10): 99
std::stoi("FF", nullptr, 16): 255
std::stoi("jJ", nullptr, 20): 399
std::stoi("Zz", nullptr, 36): 1295
결함 보고서 (Defect reports)
다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었어요.
| DR | 적용 대상 | 기존 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2009 | C++11 | std::strtol 또는 std::strtoll이 errno를 ERANGE로 설정해도 std::out_of_range가 발생하지 않았음 |
발생하게 됨 |
같이 보기
stoul, stoull (C++11) |
문자열을 부호 없는 정수로 변환하는 함수 |
|---|---|
stof, stod, stold (C++11) |
문자열을 부동소수점 값으로 변환하는 함수 |
strtol, strtoll (C++11) |
바이트 문자열을 정수 값으로 변환하는 함수 |
strtoul, strtoull (C++11) |
바이트 문자열을 부호 없는 정수 값으로 변환하는 함수 |
strtoimax, strtoumax (C++11) |
바이트 문자열을 std::intmax_t 또는 std::uintmax_t로 변환하는 함수 |
from_chars (C++17) |
문자 시퀀스를 정수 또는 부동소수점 값으로 변환하는 함수 |
atoi, atol, atoll (C++11) |
바이트 문자열을 정수 값으로 변환하는 함수 |
to_string (C++11) |
정수 또는 부동소수점 값을 문자열로 변환하는 함수 |
to_wstring (C++11) |
정수 또는 부동소수점 값을 wstring으로 변환하는 함수 |