1) substr 함수
substr 함수는 문자열의 특정 부분을 잘라내는 데 사용됩니다.
기본 사용법
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "0123456789";
string subs1 = s.substr(2, 5); // subs1 = "23456"
cout << "subs1: " << subs1 << endl;
string subs2 = s.substr(5); // subs2 = "56789"
cout << "subs2: " << subs2 << endl;
string subs3 = s.substr(); // subs3 = "0123456789"
cout << "subs3: " << subs3 << endl;
return 0;
}
- 시작 위치와 길이를 지정하여 문자열을 자릅니다.
- 시작 위치만 지정하면 해당 위치부터 끝까지 문자열을 자릅니다.
- 아무 것도 지정하지 않으면 문자열 전체를 복사합니다.
find 함수와 함께 사용하기
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "0123456789";
string subs1 = s.substr(s.find('6')); // subs1 = "6789"
cout << "subs1: " << subs1 << endl;
string subs2 = s.substr(s.find('6'), 2); // subs2 = "67"
cout << "subs2: " << subs2 << endl;
return 0;
}
- find 함수를 이용해 특정 문자나 문자열을 찾고, 그 위치부터 잘라낼 수 있습니다.
추가 팁:
- substr 함수는 범위가 문자열의 길이를 초과할 경우 자동으로 문자열 끝까지 자릅니다.
- 인덱스가 음수거나 범위를 벗어나면 out_of_range 예외가 발생할 수 있으므로 주의가 필요합니다.
2) sstream을 이용한 쪼개기
sstream을 이용하면 문자열을 특정 구분자로 쉽게 쪼갤 수 있습니다.
기본 사용법
#include <sstream>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main() {
string s = "012 34567 89";
istringstream ss(s);
string subs1; // 임시 변수
vector<string> v;
while (getline(ss, subs1, ' ')) {
v.push_back(subs1); // v = {"012", "34567", "89"}
}
// 결과 출력
for (const auto& str : v) {
cout << str << " ";
}
return 0;
}
- getline 함수를 이용하여 구분자로 문자열을 쪼개고, 이를 벡터에 저장합니다.
추가 팁:
- getline 함수는 구분자를 지정하지 않으면 기본적으로 줄바꿈 문자(\n)를 구분자로 사용합니다.
- 문자열을 여러 번 쪼개야 할 경우 istringstream을 반복 사용하여 처리할 수 있습니다.
3) C의 strtok 함수 사용
strtok 함수는 C 스타일 문자열을 특정 구분자로 쪼갤 때 사용됩니다.
기본 사용법
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char str[] = "a b c d e f";
char* p_str = strtok(str, " ");
while (p_str != NULL) {
cout << p_str << ' ';
p_str = strtok(NULL, " ");
}
return 0;
}
- 첫 번째 인자에 자를 문자열을, 두 번째 인자에 구분자를 넣어 사용합니다.
여러 구분자 사용하기
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char str2[] = "a-b,c:d e-f";
char* p_str2 = strtok(str2, ",- :");
while (p_str2 != NULL) {
cout << p_str2 << ' ';
p_str2 = strtok(NULL, ",- :");
}
return 0;
}
- 여러 구분자를 설정하여 문자열을 쪼갤 수 있습니다.
추가 팁:
- strtok 함수는 원본 문자열을 변경합니다. 따라서 원본 문자열을 보존해야 할 경우 복사본을 사용해야 합니다.
- strtok 함수는 스레드 안전하지 않으므로 멀티스레딩 환경에서는 사용을 피하거나 대체 함수(strtok_r)를 사용하는 것이 좋습니다.
마무리
위에서 다룬 substr, sstream, strtok 함수는 각각의 장점과 단점을 가지고 있습니다. 상황에 맞게 적절한 방법을 사용하여 문자열을 효율적으로 다뤄보세요. 이 글이 여러분의 C++ 프로그래밍에 도움이 되길 바랍니다.
코드 예제
substr 함수
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "0123456789";
string subs1 = s.substr(2, 5); // subs1 = "23456"
cout << "subs1: " << subs1 << endl;
string subs2 = s.substr(5); // subs2 = "56789"
cout << "subs2: " << subs2 << endl;
string subs3 = s.substr(); // subs3 = "0123456789"
cout << "subs3: " << subs3 << endl;
return 0;
}
sstream을 이용한 쪼개기
#include <sstream>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main() {
string s = "012 34567 89";
istringstream ss(s);
string subs1; // 임시 변수
vector<string> v;
while (getline(ss, subs1, ' ')) {
v.push_back(subs1); // v = {"012", "34567", "89"}
}
// 결과 출력
for (const auto& str : v) {
cout << str << " ";
}
return 0;
}
strtok 함수 사용
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char str[] = "a b c d e f";
char* p_str = strtok(str, " ");
while (p_str != NULL) {
cout << p_str << ' ';
p_str = strtok(NULL, " ");
}
return 0;
}
여러 구분자 사용하기
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char str2[] = "a-b,c:d e-f";
char* p_str2 = strtok(str2, ",- :");
while (p_str2 != NULL) {
cout << p_str2 << ' ';
p_str2 = strtok(NULL, ",- :");
}
return 0;
}
'알고리즘 > Tip' 카테고리의 다른 글
동적프로그래밍(Dynamic Programming, DP) 의 두가지 주요 특성 (0) | 2024.11.06 |
---|---|
동적계획법과 분할정복의 차이 ,그리고 동적계획법의 특징 (0) | 2024.09.08 |
백준 C++ eof 처리 방법 (0) | 2024.06.18 |