본문 바로가기
개발/C++

C++ split string by string

by 감토끼 2020. 5. 14.

C++로 문자열을 split 하는 함수를 작성했다.

기준이 되는 delimiter는 char보다는 string으로 받아야 더 유연하게 사용할 수 있어서 string으로 받게 했다.

개행문자 처리

운영체제 별로 개행문자를 다르게 쓰기 때문에 파일에서 문자열을 읽어와서 개행문자 "\n" 기준으로 split을 했을 때 결과값이 올바르지 않은 문제가 있었다.

자세히 말하자면, 내가 처리하려던 파일은 개행문자를 CRLF ("\r\n") 으로 처리하고 있어서 "\n"으로 split을 하면 문자열 끝에 "\r"이 남아서 문자열 처리 시 문제가 있었다.

이 문제를 해결하기 위해 split 된 문자열에 끝에 "\r"이 있다면 제거하도록 처리했다.

vector<string> split(std::string str, std::string delimiter)
{
    vector<string> ret;

    size_t pos = 0;
    std::string token;

    do
    {
        pos = str.find(delimiter);

        // delimiter를 못찾으면 텍스트 끝까지 token으로 취급
        if (pos == std::string::npos)
        {
            token = str;
        }
        else
        {
            token = str.substr(0, pos);
        }

        // CRLF(\r\n) 처리
        if (token[token.size() -1] == '\r')
        {
            token = token.substr(0, token.size() -1);
        }

        ret.push_back(token);
        str.erase(0, pos + delimiter.length());

    } while (pos != std::string::npos);

    return ret;
}