본문 바로가기
프로그래밍 언어/C++

C++ 문자열 -> 정수 변환 stoi vs atoi

by Jo_Wick 2025. 9. 30.
반응형

C 언어부터 문자열을 정수로 바꾸는 전통적인 함수 atoi가 있었지만, C++11에서는 stoi 계열이 추가되었다.
두 함수는 겉보기에 비슷하지만, 안전성·유연성·에러 처리 면에서 큰 차이가 있다.

 

1. atoi (C 표준, <cstdlib>)

int atoi(const char* str);

 

  • C 스타일 문자열(char)만 입력 가능 (std::string은 직접 c_str() 필요)
  • 변환 실패 시 0 반환
    → 실패한 건지 실제 값이 0인 건지 구분 불가
  • 예외 처리 기능 없음
  • 진법(base) 지정 불가 (무조건 10진수)
#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
    cout << atoi("123") << endl;   // 123
    cout << atoi("abc") << endl;   // 0 (실패인지 0인지 구분 불가)
    cout << atoi("42xyz") << endl; // 42 (중간까지만 변환)
}

 

 

2. stoi (C++11, <string>)

int stoi(const std::string& str, size_t* pos = 0, int base = 10);
  • C++ string 객체 지원 (std::string 직접 전달 가능)
  • 변환 실패 → std::invalid_argument 예외 발생
  • 범위 초과 → std::out_of_range 예외 발생
  • pos 인자로 숫자 해석이 끝난 위치 알려줌
  • base 인자로 2~36 진법까지 변환 가능
#include <iostream>
#include <string>
using namespace std;

int main() {
    try {
        size_t idx;
        int n1 = stoi("1010", &idx, 2); // 2진수 "1010" → 10
        int n2 = stoi("FF", nullptr, 16); // 16진수 "FF" → 255

        cout << n1 << " " << n2 << endl;
        cout << "parsed length: " << idx << endl;
    }
    catch (const invalid_argument& e) {
        cout << "invalid_argument" << endl;
    }
    catch (const out_of_range& e) {
        cout << "out_of_range" << endl;
    }
}

 

비교표

 

특징 atoi stoi
헤더 <cstdlib> <string>
입력 const char* std::string
실패 처리 0 반환 (구분 불가) invalid_argument 예외
범위 초과 정의되지 않음 out_of_range 예외
진법 지원 X (10진수 고정) 가능 (2~36 진법)
변환 위치 반환 X 가능 (pos)
안전성 낮음 높음

 

  • C 코드 호환이 목적 → atoi
  • C++ 프로젝트 (예외 처리 + string 사용)무조건 stoi 추천
  • 특히 사용자 입력 처리, 파일 파싱 등 실패 가능성이 있는 상황에서는 stoi가 훨씬 안전하다.

 

반응형

댓글