오늘은 문자열을 처리하는 두 가지 방법을 소개하려고 합니다!
코딩테스트의 문자열을 처리하는 문제를 만나면, 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 |
---|