728x90
substr()
substr() 함수는 문자열의 Index에서 원하는 길이의 문자열을 잘라서 string 으로 리턴합니다.
string substr (size_t pos = 0, size_t len = npos) const;
substr(0, 5) 라고 한다면 Index 0에서 시작하는 5개 문자를 잘라 string 으로 리턴합니다.
substr(6) 라고 한다면 Index 6에서 문자열의 마지막까지 잘라 string으로 리턴합니다.
#include <iostream>
#include <string>
using namespace std;
int main () {
string str = "Hello World, C++";
string newstr1 = str.substr(0, 5);
string newstr2 = str.substr(6, 5);
string newstr3 = str.substr(13, 3);
string newstr4 = str.substr(6);
string newstr5 = str.substr(13);
cout << newstr1 << std::endl;
cout << newstr2 << std::endl;
cout << newstr3 << std::endl;
return 0;
}
Hello
World
C++
World, C++
C++
substr()과 find()
find(separator, index)는 인자로 전달된 Index에서 separator를 찾고 그 Index를 리턴합니다.
separator가 없으면 npos를 리턴합니다.
구분자가 2개 이상 일때 사용하기 유용합니다.
while문 조건식에서 cur_position이 0일때, separator ","는 position이 5일때 나타납니다.
len 값은 5, result 값은 substr(0, 5) 함수로 Hello가 저장됩니다. (이후 반복)
#include <iostream>
#include <string>
using namespace std;
int main () {
string str = "Hello,World,C++";
string separator = ",";
int cur_position=0;
int position;
while ((position = str.find(separator, cur_position)) != string::npos) {
int len = position - cur_position;
string result = str.substr(cur_position, len);
cout << result << '\n';
cur_position = position + 1;
}
string result = str.substr(cur_position);
cout << result << '\n';
}
Hello
World
C++
getline() 과 istringstream
istringstream은 문자열 format을 파싱(parsing)할 때 쓰는 클래스입니다.
getline을 통해 어떤 구분자를 써서 나눴는지 알려주는게 명시적입니다.
ls는 입력 스트림 object, str은 입력받은 문자열 저장할 string 객체, delim은 구분자로 이 문자 도달 시 추출 중단
getline(istream& ls, string& str, delim)
istringstream 변수 iss에 문자열 str을 넣어 초기화 합니다.
separator 구분자로 iss 값을 분리하여 str_buf 변수에 저장합니다.
#include <iostream>
#include <sstream>
using namespace std;
int main () {
string str = "Hello,World,C++";
char separator = ",";
istringstream iss(str);
string str_buf;
while (getline(iss, str_buf, separator)) {
cout << str_buf << '\n';
}
return 0;
}
split() 직접 구현
C++에서는 STL에서 split() 함수를 지원하지 않습니다.
split() 함수는 다음과 같이 구현하고 시간복잡도는 O(N) 입니다.
while 문의 알고리즘 코드 3줄만 기억하면 됩니다.
#include <bits/stdc++.h>
using namespace std;
vector<string> split(string input, string delimiter) {
vector<string> ret;
long long pos = 0;
string token = "";
while((pos = input.find(delimiter)) != string::npos) {
token = input.substr(0, pos);
ret.push_back(token);
input.erase(0, pos + delimiter.length());
}
ret.push_back(input);
return ret;
}
int main() {
string s = "abcabc", d = "d";
vector<string> a = split(s, d);
for(string b : a) cout << b << '\n';
}
출처 : https://chbuljumeok1997.tistory.com/42
출처 : https://codechacha.com/ko/cpp-substring/