Namespaces
Variants

std:: stoi, std:: stol, std:: stoll

From cppreference.net
std::basic_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 char * (1,3,5) 타입 또는 wchar_t * (2,4,6) 타입으로 지정합니다.

1) std:: strtol ( str. c_str ( ) , & ptr, base ) 를 호출합니다.
2) std:: wcstol ( str. c_str ( ) , & ptr, base ) 를 호출합니다.
3) std:: strtol ( str. c_str ( ) , & ptr, base ) 를 호출합니다.
4) std:: wcstol ( str. c_str ( ) , & ptr, base ) 를 호출합니다.
5) std:: strtoll ( str. c_str ( ) , & ptr, base ) 를 호출합니다.
6) std:: wcstoll ( str. c_str ( ) , & ptr, base ) 를 호출합니다.

(std::isspace를 호출하여 식별되는) 모든 공백 문자들을 버리고 첫 번째 비-공백 문자를 찾을 때까지 진행한 후, 유효한 base-n (여기서 n= base ) 정수 숫자 표현을 형성하기 위해 가능한 많은 문자들을 취하여 정수 값으로 변환합니다. 유효한 정수 값은 다음 부분들로 구성됩니다:

  • (선택 사항) 양수 또는 음수 부호
  • (선택 사항) 접두사 ( 0 ) - 8진법 기수 표시 (기수가 8 또는 0 인 경우에만 적용됨)
  • (선택 사항) 접두사 ( 0x 또는 0X ) - 16진법 기수 표시 (기수가 16 또는 0 인 경우에만 적용됨)
  • 숫자 시퀀스

base에 대한 유효한 값의 집합은 {0, 2, 3, ..., 36} 입니다. base- 2 정수에 대한 유효한 숫자 집합은 {0, 1} , base- 3 정수에 대한 유효한 숫자 집합은 {0, 1, 2} 입니다. 10 보다 큰 base의 경우, 유효한 숫자에는 알파벳 문자가 포함되며, base- 11 정수의 경우 Aa 부터 시작하여 base- 36 정수의 경우 Zz 까지입니다. 문자 대소문자는 무시됩니다.

현재 설치된 C locale 에서 추가 숫자 형식을 허용할 수 있습니다.

base 값이 0 인 경우, 숫자 진법은 자동으로 감지됩니다: 접두사가 0 이면 8진법, 접두사가 0x 또는 0X 이면 16진법, 그렇지 않으면 10진법입니다.

마이너스 기호가 입력 시퀀스의 일부였다면, 숫자 시퀀스로부터 계산된 숫자 값은 결과 타입에서 단항 마이너스 연산자에 의해 부정된 것처럼 처리됩니다.

만약 pos 가 널 포인터가 아니라면, ptr str. c_str ( ) 에서 변환되지 않은 첫 번째 문자의 주소를 받게 되며, 해당 문자의 인덱스가 계산되어 * pos 에 저장되어 변환 과정에서 처리된 문자 수를 나타냅니다.

목차

매개변수

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

반환값

str 의 내용에 해당하는 정수 값.

예외

예제

#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

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 2009 C++11 std::out_of_range 예외가 발생하지 않음 -
std::strtol 또는 std::strtoll errno ERANGE 로 설정하는 경우
예외 발생

참고 항목

(C++11) (C++11)
문자열을 부호 없는 정수로 변환
(함수)
(C++11) (C++11) (C++11)
문자열을 부동 소수점 값으로 변환
(함수)
바이트 문자열을 정수 값으로 변환
(함수)
바이트 문자열을 부호 없는 정수 값으로 변환
(함수)
(C++11) (C++11)
바이트 문자열을 std::intmax_t 또는 std::uintmax_t 로 변환
(함수)
(C++17)
문자 시퀀스를 정수 또는 부동 소수점 값으로 변환
(함수)
바이트 문자열을 정수 값으로 변환
(함수)
(C++11)
정수 또는 부동 소수점 값을 string 으로 변환
(함수)
(C++11)
정수 또는 부동 소수점 값을 wstring 으로 변환
(함수)