-
string split 하는법 C++ | sstream 사용법 C++ | find함수 substr함수유용한 정보 2021. 12. 2. 21:56반응형
#include <string> #include <iostream> #include <sstream> using namespace std; int main() { stringstream ss; string tmp; ss.str("Hello new World of Sstream!!!"); ss << "Start" <<"......."; while(ss >> tmp) cout << tmp << " "; cout <<'\n'; stringstream s; string tmp2="123 456"; s.str(tmp2); int number; while(s >> number) cout << number << " "; }
C++ 에는 JAVA와 PYTHON과는 달리 split함수가 없습니다. 해당 함수를 찾는 방법에는 두 가지 방법이 있습니다.
1. sstream 사용
2. find함수 + substr 함수 사용1. sstream 사용
- 우선 <sstream> 헤더를 참조해야 합니다.
- sstream 객체를 생성해준 후, str함수안에 string객체를 집어넣습니다.
- 그 이후, 자유롭게 사용합니다.
int main() { stringstream ss; string tmp; ss.str("Hello new World of Sstream!!!"); ss << "Start" <<"......."; while(ss >> tmp) cout << tmp << " "; cout <<'\n'; stringstream s; string tmp2="123 456"; s.str(tmp2); int number; while(s >> number) cout << number << " "; cout << '\n'; cout << typeid(number).name()<<'\n'; // number형 자료형 확인 }
=> stringstream ss의 경우 >>를 하면 앞에서부터 해당 문자열만큼 대치되는 것을 알 수 있습니다.
=> 또한 띄어쓰기를 확인하여 나눠서 출력되는 것을 볼 수 있습니다.
=> string객체 안에 숫자가 있는 경우 int형으로 받아줘야 하는 제대로 된 값이 출력됩니다.
=> 숫자가 있는 경우 string으로 받을 경우 제대로 된 값이 출력되지 않습니다.
-이를 이용해 split 함수를 만들 수 있습니다.
#include <string> #include <vector> #include <iostream> #include <map> #include <sstream> #include <typeinfo> using namespace std; vector<string> split(string sentence, char Separator) { vector<string> answer; stringstream ss(sentence); string tmp; while (getline(ss, tmp, Separator)) { answer.push_back(tmp); } return answer; } int main(){ string s = "Hello Sstream World"; vector<string> answer = split(s, ' '); for(auto tmp : answer)cout <<tmp <<" "; cout<<'\n'; }
*getline함수의 사용법은 위에서 확인 가능합니다.
2. find함수 + substr함수 사용
#include <string> #include <vector> #include <iostream> #include <map> #include <sstream> #include <typeinfo> using namespace std; int main(){ string tmp = "welcome to splitWorld!!! "; int prev = 0; //이전 위치 int cur; //현재위치 cur = tmp.find(' '); while (cur != string::npos) { string substring = tmp.substr(prev, cur - prev); //첫인자에서부터 두번째 인자의 크기만큼까지를 반환하는 함수이다. => substr cout << substring << " "; prev = cur + 1; cur = tmp.find(' ',prev); //prev지점부터 탐색을 시작한다. } //남아있는 문자열 출력 cout << tmp.substr(prev, cur - prev); return 0; }
=> while문 들어갈때의 prev와 cur 변수의 값입니다.
=> find(첫번째 인자, 두 번째 인자) : 두 번째 인자에서부터 첫 번째 인자가 있는 값의 INDEX를 반환합니다. 대신, 해당 값이 없는 경우에는 string::npos를 반환하게 됩니다. (이를 기억하지 못하면 말짱 황.....)
=> 맨 마지막부분에는 저희가 원하는 인자가 없으므로 값을 찾지 못하고 출력할 수 있으므로 while문 이후에 출력문을 하나 더 작성해주어야 합니다.
문자열을 split하는 경우는 간혹 코딩 테스트에서 요구하는 경우가 있습니다.
구글링으로 검색해서 해낼 수 있으면 문제가 없다고 생각하지만, 코딩 테스트에서는 구글링을 허용하지 않으니 시간이 날 때 외우는 편이 좋아 보입니다.
특히 stringstream의 경우, 손에 익히는 과정이 필요합니다.
반응형'유용한 정보' 카테고리의 다른 글
C++ stoi 함수 | C++ string to integer (0) 2021.12.07 C++ map STL 사용법 (0) 2021.12.05 C++ sort함수 cmp 함수 (0) 2021.10.08 pair형 vector 정렬하기 / vector<pair< a, b>> sort /compare, greater, less (0) 2020.07.23 DFS, BFS code (0) 2020.07.09