C++/C++
문자열 쪼개기 Split
Elan
2021. 12. 31. 15:15
주어진 문자열을 특정 조건에 따라 나누는 방법
주의!
#include <sstream>을 안하면 std::stringstream을 사용할 수 없다.
계속 컴파일 에러가 발생하는데 심지어 에러 원인을 안가르쳐줌.
1. std::getline() 사용하여 delimiter를 기준으로 나누기
std::vector<std::string> Split(std::string input, char delimiter=' ') {
std::vector<std::string> ret;
std::stringstream ss(input);
std::string temp;
while (std::getline(ss, temp, delimiter))
ret.push_back(temp);
return ret;
}
std::getline 메서드와 std::stringstream을 이용하는 방법으로 가장 많이 사용된다.
2. Iterator Interface를 사용하는 방법
std::string text = "Let me split this into words";
std::istringstream iss(text);
std::vector<std::string> results(std::istream_iterator<std::string>{iss},
std::istream_iterator<std::string>());
장점 :
- 표준 component만 사용
- std::string 뿐만 아니라 모든 stream 형식에 대하여 사용이 가능한 방법이다.
단점 :
- delimiter는 공백 문자만 인정
3. std::istringstream을 이용하여 std::string 배열을 받기
vector<string> records[]{
{"05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT"},
{"16:00 3961 IN","16:00 0202 IN","18:00 3961 OUT","18:00 0202 OUT","23:58 3961 IN"},
{"00:00 1234 IN"}
};
vector<vector<string>> splitedRecords(records.size(),vector<string>(3)); // string 배열 3 x 3
for(int i = 0; i < records.size(); i++)
{
std::istringstream iss(records[i]);
// std::stringstream ss(records[i]); // stringstream과 istringstream 둘다 가능
for(int j = 0; j < records.size(); j++)
{
iss >> splitedRecords[i][j];
}
}
4. Stream 연산자 >> 사용하는 방법
class WordDelimitedByCommas : public std::string
{};
std::istream& operator>>(std::istream& is, WordDelimitedByCommas& output)
{
std::getline(is, output, ',');
return is;
}
int main() {
std::string text = "Let,me,split,this,into,words";
std::istringstream iss(text);
std::vector<std::string> results((std::istream_iterator<WordDelimitedByCommas>(iss)),
std::istream_iterator<WordDelimitedByCommas>());
for (auto t : results) {
std::cout << t << std::endl;
}
}