강좌와 팁

string의 split 함수 날짜:2023-1-26 1:04:50 조회수:101
작성자 : daypark
포인트 : 1074
가입일 : 2020-02-14 10:42:05
방문횟수 : 226
글 159개, 댓글 26개
소개 : 자기소개를 입력하십시오.
작성글 보기
쪽지 보내기
C++의 string 타입은 쓰기 편하고 성능도 빠른 편이지만 C의 문자열 함수를 다 지원하지는 않는다.
C#이나 자바 심지어 파이썬과 비교해도 문자열 함수가 조금 부족한 편이다.
제일 아쉬운게 토큰으로 부분 문자열을 잘라내는 split 함수인데 이게 없어 불편하다.
없으니 만들어 쓰는 수밖에 없다.
부분 문자열 추출에는 다음 두 메서드를 활용한다.

size_type find(문자열 또는 문자, 위치) : 찾은 위치 리턴, 없으면 npos를 리턴한다.
string substr(위치, 개수) : 위치에서부터 개수 문자만큼 추출한다. 개수 생략시 끝까지 추출한다.

문자열 처음부터 구분자를 검색하여 구분자 직전까지 취하고 다음 구분자로 이동하면 된다.
임의 개수의 문자열을 추출할 수 있으므로 벡터에 담는다.

#include<iostream>
#include<string>
#include<vector>

using namespace std;

// 문자열을 구분자 단위로 잘라 벡터를 리턴한다.
vector<string> string_split(string src, string delim)
{
    int start = 0;
    int end = 0;
    vector<string> ret;

    for (end = src.find(delim); ; end = src.find(delim, start))
    {
        // 더 없으면 끝까지 추출하고 리턴한다.
        if (end == string::npos) {
            ret.push_back(src.substr(start));
            break;
        }
        // 발견된 토큰을 분리하여 추가하고 구분자 다음 위치로 이동한다.
        ret.push_back(src.substr(start, end - start));
        start = end + delim.length();
        // 마지막 구분자는 무시한다.
        if (start >= src.length()) break;
    }

    return ret;
}

int main()
{
    string str = "한국;인도네시아;베트남";
    vector<string> ret = string_split(str, ";");

    for (int i = 0; i < ret.size(); i++) {
        cout << ret[i] << endl;
    }
}


실행 결과는 다음과 같다.

한국
인도네시아
베트남

이 외에 istringstream 과 getline 함수를 활용하는 방법도 있는데 구분자가 문자여야 한다는 제약이 있다.
find 메서드는 부분 문자열을 검색할 수 있어 구분자가 두 자 이상이어도 상관없다는 점에서 더 범용적이다.

    string str = "한국중국일본미국러시아";
    vector<string> ret = string_split(str, "국");

요런 코드도 동작한다는 얘기다.

 

목록보기 삭제 수정 신고 스크랩


로그인하셔야 댓글을 달 수 있습니다.