본문 바로가기
프로그래밍 언어/c c++

[c++] 문자열을 특정 문자 기준으로 자르기2 getline & stringstream

by m2162003 2020. 10. 10.

정석은 아니지만...

getline을 사용하면 문자열을 손쉽게 자를 수 있다.

 

getline(&istream is, &string str, char delim)

- is는 cin이나 stringstream

- str은 자른 문자열

- delim은 기준점이다.

원래 정의대로 라면 delim 문자를 만나면 문자열 추출이 중단된다. 이걸 이용해서 tokenize해보자.

 

일단 is 자리에 들어갈 stringstream이 필요하다.

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

using namespace std;
int main(void){
	string s = "This,is,the,test!";
    char delim = ' ';
    
    stringstream ss(input);
    string buffer;
    
    while(getline(ss, buffer, ','){
    	cout<<buffer<<" ";
    }
    
    //출력 결과: This is the test!
    return 0;
}

 

 

stringstream.str 사용: 공백으로 문자열 분리할 때

 stringstream

- #include <sstream>

- 주어진 문자열에서 필요한 정보를 빼낼 때 유용하게 사용된다.

- 스트링 버퍼를 사용하여 sequence of chars를 저장. 이 sequence는 .str()함수를 사용한다면 string object로 접근가능하다.

- 주요 함수

  • .str(string s) 이전 내용물을 버리고 현재 stream을 s로 설정한다. 
  • .clear() ss가 다음 문자열을 받기 전에 비워주는 역할
int num;
stringstream ss;

string str1 = "25 1 3 .235\n1111\n2222";
ss.str(str1);
while(ss >> num){ //조건에 맞는 문자열만 출력한다. 이 예시에선 3까지 출력
	cout<<"num: "<< num << endl; 
}

 

만약에 int num 대신 float num으로 선언한다면 모두 출력할 것이며 .235는 0.235의 형태로 출력될 것이다.

참고로 str1값이 변하진 않는다!

 

공백으로 문자열 자르기

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

using namespace std;

int main(void)
{
  string str = "1 lee 100 / 2 moon 98 / 3 son 78";

  stringstream ss(str);
  string line;

  int num, score;
  string name;

  while (getline(ss, line, '/'))
  {
    stringstream ss1;

    ss1.str(line);

    ss1 >> num;
    ss1 >> name;
    ss1 >> score;

    cout << num << "th "
         << "name is " << name << " and score is " << score << endl;

    ss1.clear();
  }

  return 0;
}

 

 

댓글