C++ Chapter 17.2 : std::string의 여러가지 생성자들과 형변환
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 17. std::string 문자열 클래스
std::string의 여러가지 생성자들과 형변환
🔔 std::string 생성자 종류
여러 생성자들로 문자열을 다양한 방식으로 초기화 할 수 있다.
디폴트 생성자
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::string my_string;
std::cout << my_string << std::endl; // 아무것도 출력 안함
return 0;
}
- 빈 문자열을 생성한다.
my_string
은 빈 문자열이므로 아무것도 출력하지 않는다.
매개 변수 1개 생성자
- 문자열 리터럴을 넘길 때
- 해당 문자열 리터럴로 초기화 한다.
#include <iostream> #include <string> #include <vector> int main() { std::string str1("my string"); std::cout << str1 << std::endl; // my string 출력 return 0; }
- 해당 문자열 리터럴로 초기화 한다.
- std::string객체를 넘길 때
- 복사 생성자가 호출된다.
#include <iostream> #include <string> #include <vector> int main() { std::string str1("my string"); std::string str2(str1); std::cout << second_string << std::endl; // my string 출력 return 0; }
- 복사 생성자가 호출된다.
매개 변수 2개 생성자
- 어떤 문자열의 반복자 2 개를 넘기면 두 반복자가 표현하는 범위만큼의 문자열을 생성한다.
- [ 시작반복자, 끝반복자 )
- 시작 반복자를 포함한 위치에서 끝 반복자의 바로 이전 위치까지.
#include <iostream> #include <string> #include <vector> int main() { std::vector<char> vec; or (auto e : "Today is a good day") vec.push_back(e); // 빈 벡터 vec에 "Today is a good day" 한글자 한글자씩 원소로 삽입 std::string second_string(vec.begin() + 3, vec.end()); // vec[3] ~ 마지막 원소까지 std::cout << second_string << std::endl; // ay is a good day 출력 std::string third_string(vec.begin(), std::find(vec.begin(), vec.end(), 'g')); // 시작 부터 'g'가 있는 위치 전까지 std::cout << third_string << std::endl; // Today is a 출력 return 0; }
- 시작 반복자를 포함한 위치에서 끝 반복자의 바로 이전 위치까지.
- [ 시작반복자, 끝반복자 )
매개변수 3개 생성자
- (문자열, 정수1, 정수2)
정수 1
번째 이후부터(정수 1
번째는 포함 안됨) 저장하되정수 2
개의 문자를 저장#include <iostream> #include <string> #include <vector> int main() { const char * my_stirng = "my string"; // <- C스타일 문자열에도 잘 작동한다. std::string second_string(my_string, 4, 2); // my_string의 4번째 글자 이후부터 2 글자만 std::cout << second_string << std::endl; // tr 출력 return 0; }
🔔 std::string 형변환
다른 데이터 타입 👉🏻 문자열
to_string(A)
: A가 어떤 데이터 타입이던간에string
으로 변환시켜 준다.
to_string
함수가 수 많은 데이터 타입으로 오버로딩 되있기에 가능한 일.
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::string my_str(std::to_string(1004)); // "1004" 문자열이 된다.
my_str += std::to_string(128); // "1004"에 "128" 더해진다. 문자열끼리 더한 것이므로 이어 붙여지고 "1004128"이 된다.
std::cout << my_str << std::endl; // "1004128" 출력
return 0;
}
문자열 👉🏻 다른 데이터 타입
stoi
👉🏻 문자열을 정수로 변환한다.#include <iostream> #include <string> #include <vector> int main() { std::string my_str(std::to_string(1004)); int i = std::stoi(my_str); std::cout << i << std::endl; // 1004 출력 return 0; }
stof
👉🏻 문자열을 실수(float)로 변환한다.#include <iostream> #include <string> #include <vector> int main() { std::string my_str(std::to_string(1004)) float f = std::stof(my_str); std::cout << f << std::endl; // 1004.0 출력 return 0; }
형변환 함수 직접 만들기 : sstream 헤더
#include <sstream>
- 문자열에서 원하는 정보만 빼낼 때 유용하게 사용할 수 있는 헤더다.
ostringstream
,istregstream
클래스를 가지고 있다.
다른 데이터 타입 👉🏻 문자열 함수 만들기 : ostringstream
- std::ostringstream 타입인
oss
객체에oss << x
어떤 데이터 타입이든 무언가를<<
연산자를 통해oss
에 넣으면oss.str()
넣어 주었던x
를 std::string 타입으로 형변환하여 리턴한다.
- 다양한 데이터 타입을 받기 위해 템플릿 함수로 구현해보자.
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
template <typename T>
std::string MyToString(T x)
{
std::ostringstream oss;
oss << x;
return oss.str();
}
int main()
{
std::string my_str(MyToString(3.141592));
std::cout << my_str << std::endl;
return 0;
}
문자열 👉🏻 다른 데이터 타입 함수 만들기 : istreagstream
- 인수로 받은
str
문자열을 담고 있는 std::istringstream 타입인iss
객체 - 인수로 문자열과, 문자열을 변환하여 넣을 다른 데이터 타입의 변수를 넘기면 첫번째 인수로 넘긴 문자열을 형변환하여 두번째 인수로 넘긴 변수가 담을 수 있도록 만드는 템플릿 함수를 구현해보자.
- bool FromString(const std::string & str, T & x)
- 문자열
str
을 형변환하여X
에 담을 것- 참조로 받으므로 인수에도 적용 된다.
- 성공하면 True, 실패하면 False 리턴
- 문자열
(iss >> x) ? true : false
str
을X
에 형 변환하여 넣는 것에 성공했다면 true, 실패했다면 false 리턴.
- bool FromString(const std::string & str, T & x)
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
template <typename T>
bool FromString(const std::string & str, T & x)
{
std::istringstream iss(str);
return (iss >> x) ? true : false;
}
int main()
{
std::string my_str("3.141592");
double d;
if (FromString(my_str, d)) // "3.141592"를 double형 3.141592로 바꾸려는 경우
std::cout << d << std::endl; // 3.14159 출력
else // "Hello" 이런걸 정수로 바꾸려는 경우엔 실패할 것
std::cout << "Cannot covert string to double" << std::endl;
return 0;
}
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기