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은 문자열을 입출력 스트림으로 다룬다.
기본 사용법
#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"
자주 쓰는 패턴
공백으로 분리된 문자열 파싱
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()이 더 간단하긴 함)
std::stringstream ss;
ss << 3.14f;
std::string str = ss.str(); // "3.14"
문자열 초기화/재사용
std::stringstream ss;
ss << "첫번째";
ss.str(""); // 내용 비우기
ss.clear(); // 에러 플래그 초기화 (이것도 같이 해야 함)
ss << "두번째";
게임에서 쓸 만한 예시
로그 메시지 조립:
std::string makeBattleLog(std::string attacker, int damage) {
std::stringstream ss;
ss << attacker << "이(가) " << damage << " 피해를 입혔습니다!";
return ss.str();
}
// "고블린이(가) 12 피해를 입혔습니다!"
CSV 형태로 저장된 아이템 데이터 파싱:
// "불꽃검,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과 비교
| 입력 소스 | 콘솔 | 문자열 |
| 사용법 | 동일하게 >> | 동일하게 >> |
| 재사용 | 불가 | 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)
'코딩 학습 > C와 C++' 카테고리의 다른 글
| C++ 팀프로젝트 - 텍스트 RPG 게임 만들기(2) (0) | 2026.03.27 |
|---|---|
| C++ 팀프로젝트 - 텍스트 RPG 게임 만들기(1) (0) | 2026.03.26 |
| C++ 기초 - 문자열 -> 숫자 변환 (0) | 2026.03.24 |
| C++ 기초 - 포션 공방 만들기 과제 (0) | 2026.03.23 |
| C++ 기초 - Vector 템플릿 구현하기 (0) | 2026.03.20 |