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가 널 포인터가 아니면, ptrstr.c_str()에서 변환되지 않은 첫 번째 문자의 주소를 받게 돼요. 그리고 그 문자의 인덱스가 계산되어 *pos에 저장되는데, 이는 변환으로 처리된 문자의 수를 의미해요.

매개변수

str - 변환할 문자열
pos - 처리된 문자 수를 저장할 정수의 주소
base - 숫자 체계(진법)

반환값

str의 내용에 해당하는 정수 값을 반환해요.

예외

  • 변환이 전혀 수행될 수 없으면 std::invalid_argument를 던져요.
  • 변환된 값이 결과 타입의 범위를 벗어나거나, 내부 함수(std::strtol 또는 std::strtoll)가 errnoERANGE로 설정하면 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::strtollerrnoERANGE로 설정해도 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으로 변환하는 함수

더 알아보기 (Learn more)

cppreference