본문 바로가기
IT & 개발/알고리즘

C++ 문자열 자르기 (istringstream&getline / strtok 함수)

by 매직아일랜드 2021. 9. 13.

오늘은 문자열을 처리하는 두 가지 방법을 소개하려고 합니다!

코딩테스트의 문자열을 처리하는 문제를 만나면, C++은 문자열을 자르는 것부터 일입니다..

하지만 문자열을 처리할 수 없다면, 문제를 해결조차 할 수 없으니 미리 익혀두는 것이 좋겠죠??

(제 이야기이지만, 시간이 부족한 상황에서 문자열을 빨리 처리할 수 있었다면.. 하는 후회가 들더라구요. )

 

그렇기에 빠른 진행을 위해서는 문자열 처리 방식을 오늘 정리해보아요!

 

1. istringstream과 getline함수 사용하기

   - 상황 : 문자열 구분자가 하나인 경우, 사용하기 유용함

            : strtok 함수와 달리, input값이 string으로 주어져도 형 변환이 필요하지 않음

   - 헤더 : #include <sstream>을 사용하여 sstream 헤더를 추가

   - 코드 (참고로, stringstream은 문자열에서 동작하는 스트림 클래스입니다.)

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

using namespace std;

int main(){
	string str="str1 str2 str3";
    istringstream ss(str);
    string strBuffer;
    vector<string> v;
    
    v.clear();
    //ss에는 문자열 버퍼에 구분자(' ')로 자르고 남은 문자열이 저장됨
    while (getline(ss, strBuffer, ' ')){
        v.push_back(strBuffer);
    }
    
    //auto를 사용하면 벡터의 값을 쉽게 가지고 와서 사용할 수 있음
    //아래 주석과 동일한 의미
    //for(int i=0;i<v.size();i++) cout<<v[i]<<endl;
    for(auto i:v) cout << i << endl;
    
    return 0;
}

   - 결과

2. strtok 함수 사용하기

   - 상황 : 문자열 구분자가 두 개 이상인 경우, 사용하기 유용함

            : strtok 함수를 사용할 때에는 input값에 유의하여 사용해야 함

   - 헤더 : #include <string.h>을 사용하여 string.h 헤더를 추가

   - 코드

#include <string>
#include <vector>
#include<string.h>
#include <iostream>

using namespace std;

int main(){
	string str ="str1|str2 str3";
    char ch[str.length()];
    //string -> char[]로 변환해줘야 함
    strcpy(ch, str.c_str());
    //구분자를 두번째 인자값으로 넣어줌
    //ex | 와 (공백)을 구분자로 사용 => "| "
    char * ptr = strtok(ch, "| ");
    vector<string> v;
	
    //ptr이 null이 아닐 때까지 반복
    while(ptr != NULL){
    	//string으로 변환하여 벡터에 넣어줌
        v.push_back(string(ptr));
        ptr = strtok(NULL, "| ");
    }
    
    for(auto i:v) cout << i << endl;
	return 0;
}

    - 결과

    - 부가설명

       strtok의 함수는 지정된 문자를 기준으로 문자열을 자른다..

       함수 정의 : char *strtok(char *_String, char const *_Delimiter);

       1) strtok 함수의 첫 번째 인자로 ptr을 넣는 경우, 문자열의 첫 시작 위치부터 비교하므로 첫 구분자까지의 문자열              이 계속해서 잘린다.

       2) strtok 함수의 첫 번째 인자로 NULL을 넣는 경우, strtok 함수에서 잘린 문자열만큼 이동한 위치부터 비교하며              로 다음 문자열을 자른다.
     

       즉, 처음 한 번만 문자열의 시작 위치로 넣어주고, 이후부터는 NULL을 input으로 넣어주어야 합니다.

 

 

잘못 작성된 내용 또는 더 나은 방안이 있다면, 언제든 댓글로 남겨주시면 감사하겠습니다!

'IT & 개발 > 알고리즘' 카테고리의 다른 글

2018 카카오 코테 비밀지도  (0) 2021.09.11