코딩 학습/C와 C++

C++ 기초 - 찾고, 자르고, 바꾸기

이개 2026. 3. 25. 16:00

string

  • string은 사실 vector<char>의 사촌
  • 문자(char)를 연속 메모리에 담는 것

 

find - 검색 위치를 반환

  • s.find("World")를 호출하면 시작 인덱스(위치)를 반환한다.
  • npos="no position"의 줄임말
size_t pos = s.find("검색어");
if(pos != string::npos){
	// pos는 시작 위치
}
  • find를 쓰면 반드시 npos 체크!

find의 두 번째 매개변수

어디서부터 찾을지를 지정

ctrl + F 등에서 사용

s.find("Hello", 7)

시간 복잡도: 최악O(n*m)(원본 길이*검색어 길이)

 

substr

 

파일 확장자 분리

filename = "game_save.dat"

find('.') -> 위치 9

substr(0,9) -> "game_save" (파일명)

substr(10) -> dat (확장자)

 

replace - 범위를 새 문자열로 교체

다 바꾸려면 replaceAll

 

 

stringstream

문자열을 마치 입력 스트림(cin)처럼 취급해서 데이터를 하나씩 꺼낼 수 있게 해줌

stringstream은 문자열을 스트림처럼 다루는 클래스.

cin/cout이 콘솔을 스트림으로 다루듯이, stringstream은 문자열을 입출력 스트림으로 다룬다.


기본 사용법

 
 
cpp
#include <sstream>
#include <string>

// 문자열 → 숫자 파싱
std::string input = "42";
std::stringstream ss(input);
int num;
ss >> num; // num = 42

// 숫자 → 문자열 조립
std::stringstream ss2;
ss2 << "HP: " << 100 << "/" << 100;
std::string result = ss2.str(); // "HP: 100/100"

자주 쓰는 패턴

공백으로 분리된 문자열 파싱

 
 
cpp
std::string line = "goblin 60 12"; // 이름 hp attack
std::stringstream ss(line);

std::string name;
int hp, attack;
ss >> name >> hp >> attack;
// name="goblin", hp=60, attack=12

숫자를 문자열로 변환 (C++11 이상에선 to_string()이 더 간단하긴 함)

 
 
cpp
std::stringstream ss;
ss << 3.14f;
std::string str = ss.str(); // "3.14"

문자열 초기화/재사용

 
 
cpp
std::stringstream ss;
ss << "첫번째";
ss.str("");   // 내용 비우기
ss.clear();   // 에러 플래그 초기화 (이것도 같이 해야 함)
ss << "두번째";

게임에서 쓸 만한 예시

로그 메시지 조립:

 
 
cpp
std::string makeBattleLog(std::string attacker, int damage) {
    std::stringstream ss;
    ss << attacker << "이(가) " << damage << " 피해를 입혔습니다!";
    return ss.str();
}

// "고블린이(가) 12 피해를 입혔습니다!"

CSV 형태로 저장된 아이템 데이터 파싱:

 
 
cpp
// "불꽃검,50,15,burn" 같은 데이터를 읽을 때
std::string data = "불꽃검,50,15,burn";
std::stringstream ss(data);
std::string token;

while (std::getline(ss, token, ',')) {
    std::cout << token << "\n";
    // 불꽃검
    // 50
    // 15
    // burn
}

cin과 비교

cinstringstream
입력 소스 콘솔 문자열
사용법 동일하게 >> 동일하게 >>
재사용 불가 str("")로 초기화 가능
용도 실시간 입력 문자열 파싱/조립

 

 

 

아호코라식

문자열 여러 개를 한 번에 검색하는 알고리즘.

예를 들어 긴 텍스트에서 ["he", "she", "his", "hers"] 를 전부 찾고 싶을 때, 단순하게 하면 단어마다 따로 탐색해야 하지만 아호코라식은 한 번 훑으면서 전부 찾습니다.


핵심 구조 3가지

1. 트라이(Trie) — 검색할 단어들로 트리를 만듦

 
 
        root
        ├── h
        │   ├── e (he ✓)
        │   │   └── r
        │   │       └── s (hers ✓)
        │   └── i
        │       └── s (his ✓)
        └── s
            └── h
                └── e (she ✓)

2. 실패 링크(Failure Link) — 매칭 실패 시 어디로 돌아갈지

트라이만 있으면 she를 찾다가 실패하면 처음부터 다시 시작합니다. 실패 링크는 "지금까지 매칭된 부분 중 재활용 가능한 곳"으로 점프.

 
 
"she" 탐색 중 s→h→e 성공
동시에 "he"도 찾아짐 ← 실패 링크 덕분에

3. 출력 링크(Output Link) — 한 위치에서 여러 단어가 동시에 매칭될 때


시간복잡도

방식복잡도
단순 반복 O(텍스트 길이 × 단어 수)
아호코라식 O(텍스트 길이 + 매칭 수)

단어가 많을수록 압도적으로 빠름.


실제로 쓰이는 곳

  • 바이러스 백신 — 악성코드 패턴 수천 개를 파일에서 한 번에 탐색
  • 채팅 필터 — 금지어 목록을 메시지에서 동시에 검색
  • 침입 탐지 시스템(IDS)