까먹어서 다시하는 c++

코테용- c++ split 함수 (string 나누기/string 잘라서 배열에 넣기)

FireStone 2020. 4. 16. 18:37

코테를 c++로 하면서 느낀점은..속도를 제외하고 c++의 좋은점을 아직 잘 모르겠다는 점이다..

항상 코딩테스트를 보면 string을 잘라야하는 순간이 생기는데 그럴때마다 자바로 갈아타고 싶다.. 

이미 자바로 갈아탔고,, 또 느끼는건 문자열은 파이썬이 최고다..ㅎ

그래서 그냥 split 함수를 외워서 사용하기로 했다.

코테를 준비하는 분들이라면 split 함수는 외워서 쓰는게 나을듯합니다🙄

 

1. istringstream 과 getline 함수를 사용

급하신 분은 바로 코드로 ㄱ

해당 예시는 문자열을 공백(" ")구분자로 자르고 벡터에 넣는 예시입니다.

* istringstream은 공백을 구분해주기에 공백외의 구분자(ex. ' , ' )가 필요한 경우 1) 코드를 사용해주세요

(물론 공백이 구분자인 분도 사용하셔도 됩니다)

 

공부하기 위해 보시는 분들이라면 바로 밑의 1)코드 말고 그 밑에 있는 istringstream에 대한 설명부터 보고 1)코드를 보는 걸 추천합니다. 

- istringstream은 sstream 을 include해 사용할 수 있는 stream class이다. => include<sstream> 해줄것

* 간단히 말하자면 istringstream은 문자열을 추출해내는 작업이다.  여기서는 입력스트림으로 사용한다. 

- getline 설명은 밑에서 3)으로 ㄱ ㄱ

 

1) 구분자가 있는 경우 split으로 잘라 vector 에 넣기

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

using namespace std;

int main()
{
    string str="java c c++ python";
    istringstream ss(str);
    string stringBuffer;
    vector<string> x;
    x.clear();
    cout<<"어떻게 잘리는지 확인해봅시다 ->";
    //구분자가 , 이라면 getline(ss, stringBuffer, ',')쓰면됨
    while (getline(ss, stringBuffer, ' ')){
        x.push_back(stringBuffer);
        cout<<stringBuffer<<" ";
    }
    
    cout<<endl<<"vector 값을 출력해보자."<<endl;
    for(int i=0;i<x.size();i++){
        cout<<x[i]<<endl;
    }
    
    return 0;
}

1) code 실행결과


2) about istringstream

 istringstream  문자열 포맷을 parsing 할 때 사용합니다. 

*얘 자체도 자르는 기능이 있다고 봐야한다..코드를 보면서 확인하시길

 

=> 문자열에서 필요한 값을 추출하고, 공백과 \n을 무시합니다.

그래서 공백이 있는 문자열을 나누기에는 편하다

- 밑에처럼 str()을 사용하면 문자열 확인 가능

- ss>>str1 ;을 하면 str1에 처음으로 잘린 'java'가 들어간다.

=> 잘린 두개의 문자열을 저장하고 싶으면?

    ss>>str1>>str2; 을 하면 str1에는 'java' 가 들어가고 str2에는 'c'가 들어간다.

=> 이걸 이용해 while문에 (ss>>str_copy)이런식으로 조건을 걸어주면 whil문이 알아서 잘린 갯수대로 도는 것같다. => 코드에서 ss_count를 통해 확인 가능

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

using namespace std;

int main()
{
    string str="java c c++ python";
    istringstream ss(str);
    istringstream ss2(str);
    string stringBuffer;
    string str_copy;
    string str_copy2;
    vector<string> x;
    x.clear();
    int ss_count=0;
    //ss.str()을 하면 알아서 문자열이 추출된다.
    cout<<"1결과-> "<<ss.str()<<endl;
    //ss의 사이즈는 문자열의 길이가 출력된다.
    cout<<"ss의 size: "<<ss.str().size()<<endl;
    
   //잘린 ss를 이런식으로 다른 문자열에 copy할 수 있다.
    cout<<"다른 문자열에 복사(옮기기)-> ";
    while(ss>>str_copy){
        cout<<str_copy<<",";
    }
    cout<<endl;
    
    //vector에 넣으려했는데 ss가 몇개로 나뉜건지 size를 알수가 없다..그래서 ss2>>str_copy2를 조건으로 걸었다.
    //ss2를 사용한 이유는 위에서 이미 ss를 사용해서 str_copy에 넣었기 때문에 사용이 안되더라..그래서 ss2와 str_copy2를 만들었다
    cout<<"vector에 넣고 확인해봅시다"<<endl;
    while(ss2>>str_copy2){
        x.push_back(str_copy2);
        ss_count++;
    }
    
    for(int i=0;i<x.size();i++){
        cout<<x[i]<<endl;
    }
    cout<<"몇개가 잘렸는지 확인해봅시다: "<<ss_count<<endl;

    return 0;
}


code2 결과

-3) getline()에 대해

ls : 입력스트림 object 

str: 입력받은 문자열을 저장할 string 객체

delim : 구분자로 이 문자에 도달할 시 추출이 중단됨

istream & getline(istream& ls, string& str, delim)

 

2. find 함수& substr 사용

이건 구분자가 2개이상일때 사용하기 유용하다.

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

using namespace std;

int main()
{
    string str="java,c,c++,python";
    int previous =0;
    int current=0;
    vector<string> x;
    x.clear();
   
    current= str.find(',');
    //find는 찾을게 없으면 npos를 리턴함
    while(current!=string::npos){
        string substring=str.substr(previous,current-previous);
        x.push_back(substring);
        previous = current+1;
        current=str.find(',',previous);
    }
    x.push_back(str.substr(previous,current-previous));
    
    for(int i=0;i<x.size();i++){
        cout<<x[i]<<endl;
    }
    
    
    return 0;
}

 

 

위의 코드 실행 결과

https://makedotworld.tistory.com/28

 

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

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

makedotworld.tistory.com

 

 

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

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

makedotworld.tistory.com

 

 

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

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

makedotworld.tistory.com