관리 메뉴

有希

C++/문자열에서 앞 뒤 공백 제거, 문자열에서 공백을 없애고 split하기 본문

프로그래밍/알고리즘+코딩테스트

C++/문자열에서 앞 뒤 공백 제거, 문자열에서 공백을 없애고 split하기

有希. 2022. 3. 29. 19:15

필요한 헤더는 <functional> <string>이다. 

find_if는 있다면 해당 위치 반환, 없으면 두번째 인자를 반환한다. isspace의 not이므로 "123" 같은 경우는 1을 발견했으니 0의 iter를 반환하고, "    " 같은 경우는 문자열의 end() iter를 반환해서 다 지운다.

string ltrim(const string &str) {
    string s(str);

    s.erase(
        s.begin(),
        find_if(s.begin(), s.end(), not1(ptr_fun<int, int>(isspace)))
    );

    return s;
}

string rtrim(const string &str) {
    string s(str);

    s.erase(
        find_if(s.rbegin(), s.rend(), not1(ptr_fun<int, int>(isspace))).base(),
        s.end()
    );

    return s;
}

공백이 몇 칸 있든간에 다 지우고 공백이 아닌 문자열들로 쪼개서 vector에 저장하는 split함수

마지막에 tokens.push_back() 해주는 이유는 "1 2 3"같은 상황에서 while에서는 2까지만 넣고 빠져나와 버린다. start는 3을 가리키는 상태로. 이 상태에서 substr(start)해주면 문자열에 끝까지 tokens에 다시 원소로 넣어준다. 이러면 위와 같은 상황에서 3이 잘 들어간다.

vector<string> split(const string &str) {
    vector<string> tokens;

    string::size_type start = 0;
    string::size_type end = 0;

    while ((end = str.find(" ", start)) != string::npos) {
        tokens.push_back(str.substr(start, end - start));

        start = end + 1;
    }

    tokens.push_back(str.substr(start));

    return tokens;
}