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

C++ String 헤더의 substr / find / erase 사용법

by Jo_Wick 2025. 9. 29.
반응형

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"

 

 

반응형

댓글