반응형
1. substr (부분 문자열 추출)
string substr(size_t pos = 0, size_t count = npos) const;
- pos: 시작 인덱스 (0-based)
- count: 추출 길이 (생략 시 끝까지)
- 반환: 새 std::string (원본은 불변)
- 예외: pos > size()면 std::out_of_range
예시
#include <string>
#include <iostream>
using namespace std;
int main() {
string s = "Hello World";
cout << s.substr(0, 5) << "\n"; // "Hello"
cout << s.substr(6) << "\n"; // "World" (끝까지)
cout << s.substr(3, 100) << "\n"; // "lo World" (남은만큼만)
try {
cout << s.substr(50) << "\n"; // out_of_range 예외
} catch (const out_of_range& e) {
cout << "out_of_range: " << e.what() << "\n";
}
}
- pos == size()는 빈 문자열 반환 (예외 아님)
- count가 남은 길이보다 커도 예외 없음 (자동 절단)
- 복사 비용이 있으니 대형 문자열에서 남발 주의
2. find (문자열/문자/집합 검색)
size_t find(const string& needle, size_t pos = 0) const;
size_t find(const char* needle, size_t pos = 0) const;
size_t find(const char* needle, size_t pos, size_t count) const; // 앞 count글자만
size_t find(char ch, size_t pos = 0) const;
| 오버로드 | needle | pos | count |
| find(const string& needle, size_t pos=0) | 찾을 문자열 객체 | 검색 시작 위치 | ❌ 없음 |
| find(const char* needle, size_t pos=0) | 찾을 C 문자열 전체 | 검색 시작 위치 | ❌ 없음 |
| find(const char* needle, size_t pos, size_t count) | needle의 앞 count글자만 사용 | 검색 시작 위치 | needle 길이 제한 |
| find(char ch, size_t pos=0) | 찾을 단일 문자 | 검색 시작 위치 | ❌ 없음 |
- 반환: 발견 시 시작 인덱스, 실패 시 string::npos
예시
#include <string>
#include <iostream>
using namespace std;
int main() {
string s = "abracadabra";
size_t p1 = s.find("bra"); // 1
size_t p2 = s.find("bra", 2); // 8 (2부터 검색)
size_t p3 = s.find("abra", 2, 2); // 7 ("abra" 중 "ab"만을 검색)
size_t p4 = s.find('c'); // 4
size_t p5 = s.find("xyz"); // string::npos
if (p5 == string::npos) cout << "not found\n";
cout << p1 << " " << p2 << " " << p3 << " " << p4 << "\n";
}
3. erase (문자열에서 일부 혹은 전체문자 제거)
1. erase(pos = 0, count = npos)
string& erase(size_t pos = 0, size_t count = npos);
- pos: 지울 시작 위치 (0-based)
- count: 지울 길이 (생략 시 끝까지)
- 반환: string& (자기 자신 참조)
string s = "Hello World";
s.erase(5); // 5번 인덱스부터 끝까지 제거 → "Hello"
s.erase(0, 2); // 0~1 인덱스 제거 → "llo World"
2. erase(iterator position)
iterator erase(const_iterator position);
- 특정 위치의 문자 1개를 지움.
- 반환값: 다음 문자 위치의 iterator
string s = "Hello";
auto it = s.erase(s.begin() + 1); // 'e' 삭제 → "Hllo"
cout << *it; // 'l' (삭제된 문자 다음 위치)
3. erase(iterator first, iterator last)
iterator erase(const_iterator first, const_iterator last);
- [first, last) 범위 전체 삭제.
- 반환값: last 뒤 문자 위치의 iterator
string s = "abcdef";
s.erase(s.begin() + 2, s.begin() + 5); // 인덱스 2~4 제거 → "abf"
전체 지우기
string s = "data";
s.erase(); // "" (빈 문자열)
- 사실상 s.clear();와 동일.
예외 규칙
- pos가 size()보다 크면 → std::out_of_range 발생.
- count가 남은 길이보다 커도 괜찮음 (자동으로 끝까지만 지움).
- iterator 버전은 범위를 벗어나면 정의되지 않은 동작(UB).
자주 쓰이는 패턴
1. 문자열 내 특정 문자 전부 제거
string s = "a-b-c-d";
for (size_t pos; (pos = s.find('-')) != string::npos; )
s.erase(pos, 1); // '-' 삭제
// 결과: "abcd"
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
| C++ 문자 대소문자 판별 & 변환 함수 정리 (isupper, islower, toupper, tolower) (0) | 2025.09.30 |
|---|---|
| C++ string::npos (-1) find함수의 반환값 (0) | 2025.09.29 |
| C++에서 NULL , NUL, 0, \0 의 차이 (0) | 2025.09.27 |
| C++ 연산자 우선 순위 (0) | 2025.09.21 |
| C++ 특정 문자 사이 값 입력받기 (0) | 2025.09.20 |
댓글