본문 바로가기
알고리즘

[C++] C++에서 문자열 split하기

by SiO2whocode 2021. 10. 6.
반응형
  • istringstream과 getline사용
#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main(){
    //나눌 문자열
    string str = "C is quirky, flawed, and an enormous success";
    //나눈 문자열들을 담을 변수
    string token;
 
    //방법1 : istringstream 사용

    //문자열을 ' '(공백 1칸)으로 구분하기
    istringstream iss(str);
    
    //getline은 구분자로 char 즉 하나의 문자 밖에 못받음
    while(getline(iss, token, ' '))
        cout << token << "\n";
        
    //같은 문자열을 ,로 구분하기
    //stream을 흔히 흐르는 물에 비유하듯이 한번 흘려보내면 끝. 재사용 불가.
    //같은 문자열도 다시 쓰려면 또 다른 stream을 선언해줘야한다.
    istringstream iss2(str);
    while(getline(iss2, token, ','))
        cout << token << "\n";
        
    return 0;
}​

 

//구분자(delimiter)를 만날 때 까지 모든 문자열을 입력 받아 하나의 string 객체(str)에 저장
istream& getline(istream& s, string& str, char delimeter);

 

  • 이를 vector에 저장하기
    istringstream iss3(str);
    vector<string> tokens;
    while(getline(iss3, token, ' ')){
        tokens.push_back(token);
    }

 

  • string.find, substr 사용
    //방법2 : string.find, substr 사용
    
    size_t previous, current;
    //인덱스 0번부터 찾기 시작
    previous = 0;
    //구분자 위치(인덱스)
    current = strDivByComma.find(",");
    
    //string.find는 문자를 찾지 못하면 npos를 반환함
    while(current != string::npos){
        //substr(start, length)
        token = strDivByComma.substr(previous, current-previous);
        cout << token << "\n";
        
        //previous 위치를 current(구분자)다음 위치로 이동
        previous = current+1;
        //previous위치 부터 ,를 찾는다.
        current = strDivByComma.find(",",previous);
    }
    
    //마지막 구분 문자열 출력
    token = strDivByComma.substr(previous,current-previous);
    cout << token << "\n";

 

두번째방법을 사용하면 구분자가 2개 이상일 때를 처리할 수 있는데

예를들어 cpp,java,python.swift를 , 혹은 . 을 기준으로 구분해야 한다면

find(",", previous) 와 find(".",previous) 중 작은 값을 current에 대입하면 될 것 같다.

 

 

참고

https://jhnyang.tistory.com/107

 

C언어 문자열 istream::getline()과 C++ string의 getline()! 한 줄 읽는 함수가 두 개?

[C언어, C++언어, JAVA언어 포스팅 링크, 라이브러리 함수 모음 링크] [C/C++] 포스팅에 들어가기 전 cstring vs string.h vs string 스트링클래스 차이(C-strings vs std::string) 이 포스팅을 먼저 읽고 보길..

jhnyang.tistory.com

https://makedotworld.tistory.com/28

 

[C++] C++에서 string 문자열을 받아와 split 하기

C++로 알고리즘 문제를 풀다 보면 다른 언어에 비해 구현하기 불편한 부분이 은근 많다. Java의 split 함수와 같이 작관적이고 쓰기 간편한 함수가 있었으면 좋겠지만, C++에서는 되게 다양한 방법으

makedotworld.tistory.com

 

반응형

댓글0