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;
	}

}