코테를 준비하면서 문제를 풀 때 등 일반적으로 C++ 로 코딩하면서 가장 많이 접하게 되는 작업 중 하나가 문자열(string)과 숫자(int)사이에서의 형 변환이 아닐까 싶습니다.
stringstream을 사용한다거나 루프를 사용해서 형 변환을 하는 방법도 있지만, 본 포스팅에서는 함수를 사용하여 string형을 숫자형으로 변환하는 방법에 대해 다루어 보겠습니다.
숫자형에서 string형으로 변환하는 방법은 다음 포스팅을 참고해주세요.
먼저 함수들을 사용하기 위해 string 헤더파일을 잊지말고 include 해주세요.
#include <string>
stoi, stol, stoll, stoul, stoull 함수 구문
다음 함수들은 string 문자열을 해당 정수 숫자형으로 변환합니다.
int stoi (const string& str, size_t* idx = 0, int base = 10);
long stol (const string& str, size_t* idx = 0, int base = 10);
long long stoll (const string& str, size_t* idx = 0, int base = 10);
unsigned long stoul (const string& str, size_t* idx = 0, int base = 10);
unsigned long long stoull (const string& str, size_t* idx = 0, int base = 10);
매개변수
- (필수사항) const string& str: 숫자로 변환하고 싶은 문자열입니다.
- (선택사항) size_t* idx = 0: 문자열에서 숫자 다음으로 나오는 문자 중 숫자가 아니기 시작한 색인(index)을 가리키는 포인터입니다.
- (선택사항) int base = 10: str의 진수를 의미합니다. str 문자열이 의미하는 숫자의 진수가 무엇인지를 표현하는 것입니다. default는 10진수입니다.
반환값
- stoi: int형 정수를 반환합니다.
- stol: long형 정수를 반환합니다.
- stoll: long long형 정수를 반환합니다.
- stoul: unsigned long형 정수를 반환합니다.
- stoull: unsigned long long형 정수를 반환합니다.
stod, stof, stold 함수 구문
다음 함수들은 string 문자열을 해당 실수 숫자형으로 변환합니다.
double stod (const string& str, size_t* idx = 0);
float stof (const string& str, size_t* idx = 0);
long double stold (const string& str, size_t* idx = 0);
매개변수
- (필수사항) const string& str: 숫자로 변환하고 싶은 문자열입니다.
- (선택사항) size_t* idx = 0: 문자열에서 숫자 다음으로 나오는 문자 중 숫자가 아니기 시작한 색인(index)을 가리키는 포인터입니다.
반환값
- stod: double형 실수를 반환합니다.
- stof: float형 실수를 반환합니다.
- stold: long double형 실수를 반환합니다.
string형 -> 정수 숫자형 변환 예제
다음 예제들은 stoi() 함수를 사용하여 string을 int로 바꿨습니다. 다른 정수 숫자형으로 변환해주는 stol, stoll, stoul, stoull 함수들 모두 동일한 방식으로 사용할 수 있습니다.
#include <cstring>
#include <iostream>
using namespace std;
int main() {
string s_num = "1234";
int i_num = stoi(s_num);
cout << "int로 변환: " << i_num << endl;
}
결과값:
// idx 매개변수 활용
#include <cstring>
#include <iostream>
using namespace std;
int main() {
string s_num = "1234abc";
size_t index;
int i_num = stoi(s_num, &index);
cout << "int로 변환: " << i_num << endl;
cout << "숫자가 아닌 문자의 시작 색인: " << index << endl;
}
결과값:
색인(index) 4인 ‘a’ 부터 숫자가 아닙니다. idx 매개변수를 활용하여 문자열 안에서 숫자가 아니기 시작한 위치를 알아낼 수 있습니다.
// base 매개변수 활용
#include <cstring>
#include <iostream>
using namespace std;
int main() {
string s_num = "1234";
int i_num = stoi(s_num, nullptr, 8);
cout << "8진수 int로 변환: " << i_num << endl;
}
결과값:
base 매개변수로 8을 넣어주었기 때문에 10진수 “1234”를 8진수 “668”로 변환 되었습니다.
세번째 매개변수인 base를 이용하면서 idx 매개변수는 이용하지 않을거면 nullptr를 두번째 매개변수로 넣어주어야 합니다.
string형 -> 실수 숫자형 변환 예제
다음 예제들은 stod() 함수를 사용하여 string을 double로 바꿨습니다. 다른 실수 숫자형으로 변환해주는 stof, stold 함수들 모두 동일한 방식으로 사용할 수 있습니다.
#include <cstring>
#include <iostream>
using namespace std;
int main() {
string s_num = "1234.56";
double d_num = stod(s_num);
cout << "double로 변환: " << d_num << endl;
}
결과값:
// idx 매개변수 활용
#include <cstring>
#include <iostream>
using namespace std;
int main() {
string s_num = "1234.56abc";
size_t index;
double d_num = stod(s_num, &index);
cout << "double로 변환: " << d_num << endl;
cout << "숫자가 아닌 문자의 시작 색인: " << index << endl;
}
결과값:
색인(index) 7인 ‘a’ 부터 숫자가 아닙니다. idx 매개변수를 활용하여 문자열 안에서 숫자가 아니기 시작한 위치를 알아낼 수 있습니다.
마무리
본 포스팅에서 다룬 함수들을 호출함으로서 string 문자열을 int, long, double, float, long double, long long, unsigned long 또는 unsigned long long 숫자형으로 변환할 수 있습니다.
이미 눈치 채셨겠지만 함수명들은 간단한게 “String TO” + “Integer” 등 string 문자열을 어떤 숫자형으로 변환하냐에 따라 축약되어 지어졌습니다.
따라서 무엇을 사용해야 할지 헷갈리신다면 함수명에서 “sto” 다음에 어떤 문자가 써 있는지만 확인해주시면 쉽게 구분이 가능합니다.