프로그래밍을 하다 보면 다양한 타입들을 변환해야 하는 상황이 생깁니다.
C++에서 int나 long 타입을 string으로 변환하는 것은 아래에서 확인 가능합니다.
2019/11/15 - [Programming/C&CPP] - C++ int를 string으로 변경하는 방법
반대로 string을 int로 변환하는 방법들을 소개합니다.
1. std::stringstream 사용
string을 int로 변환하는데도 std::stringstream 사용됩니다.
#include <iostream>
#include <sstream>
int main()
{
int i = 0;
std::stringstream ssInt("123");
ssInt >> i;
double d = 0.0;
std::stringstream ssDouble("12.3456");
ssDouble >> d;
if (!ssInt.fail())
std::cout << ssInt.str() << std::endl;
if (!ssDouble.fail())
std::cout << ssDouble.str() << std::endl;
return 0;
}
stringstream을 생성할 때 문자열을 넣고 >> 연산자로 int나 double으로 전달합니다.
출력하기 전에 fail() 메소드를 사용해서 실제 numeric 타입인지 체크해야 합니다.
문자열이 int 타입으로 변환되지 않는 경우 fail()이 true를 리턴합니다.
2. boost::lexical_cast 사용
boost::lexical_cast 역시 사용이 가능합니다.
변환할 타입인 int, double를 입력하면 string이 변환됩니다.
#include <iostream>
#include <string>
#include <boost/lexical_cast.hpp>
int main()
{
std::string i = "123";
std::string d = "12.3456";
std::cout << boost::lexical_cast<int>(i) << std::endl;
std::cout << boost::lexical_cast<double>(d) << std::endl;
return 0;
}
lexical_cast는 타입 변환을 실패하면 bad_lexical_cast 예외를 발생시킵니다.
예외를 처리하기 위해서 아래와 같은 형태로 작성하면 됩니다.
#include <iostream>
#include <string>
#include <boost/lexical_cast.hpp>
int main()
{
std::string invalid = "Hello";
try {
std::cout << boost::lexical_cast<int>(invalid) << std::endl;
}
catch (boost::bad_lexical_cast& e) {
std::cout << e.what() << std::endl;
}
return 0;
}
다음과 같은 예외가 발생하는 것을 확인할 수 있습니다.
예외처리를 해서 변환되지 않는 타입을 처리하면 됩니다.
3. std::stoi() 사용
C++11에 string을 int로 변환하기 위한 std::stoi()가 추가되었습니다.
다양한 타입을 위해 std::stoi(), std::stol(), std::stod(), std::stof() 등의 메소드가 추가되었습니다.
#include <iostream>
#include <string>
int main()
{
std::string int_val = "123";
std::string double_val = "12.3456";
int i = std::stoi(int_val);
double d = std::stod(double_val);
std::cout << i << std::endl;
std::cout << d << std::endl;
return 0;
}
이 경우에 맞는 타입이 아닌 값을 입력하면 std::invalid_argument 예외가 발생합니다.
적절한 예외처리 코드를 추가해서 numeric 타입이 아닌 문자열에 대응하면 됩니다.
C++ 개발 환경에 맞춰 원하는 방법을 선택해서 사용하면 됩니다.
다만 int 타입으로 변환되지 않는 문자열에 대한 처리를 주의해서 코드를 작성하면 됩니다.
'Programming > C&CPP' 카테고리의 다른 글
C++ string (문자열) 소문자, 대문자 변환 (0) | 2020.11.06 |
---|---|
C++ 벡터(vector) 혹은 배열에서 최대값, 최소값 찾기 (0) | 2020.09.14 |
C++ int를 string으로 변경하는 방법 (0) | 2019.11.15 |
C++ std::string 토큰(Token) 분리 방법(Tokenize) (0) | 2018.11.22 |
C++ 홀수/짝수(홀짝) 구분 방법 (0) | 2018.10.28 |