반응형
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가 훨씬 안전하다.
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
| C++ to_string 숫자 -> 문자열 변환 함수 (0) | 2025.10.01 |
|---|---|
| C++ 문자열 -> 숫자 변환 atoi vs stoi vs from_chars (1) | 2025.10.01 |
| C++ stoi 사용법 정리 (0) | 2025.09.30 |
| C++ 숫자 / 알파벳 / 공백 / 특수문자 판별 함수 정리 (isalpha, isdigit, isalnum, isspace, ispunct) (0) | 2025.09.30 |
| C++ 문자 대소문자 판별 & 변환 함수 정리 (isupper, islower, toupper, tolower) (0) | 2025.09.30 |
댓글