String
- string은 사실 vector<char>의 사촌이다. string은 문자(char)를 연속 메모리에 담는 것.
- 인덱스 접근방법 O(1), size(), push_back() 모두 vector와 동일
- string은 vector<char>에서 찾기, 자르기, 바꾸기 기능이 추가된 형태이다.
find - 검색 위치를 반환
- s.find("찾을 문자열")를 호출하면 시작 인덱스(위치)를 반환한다.
 |
| s.find("World") → 6 |
- 찾지 못하면 string::npos라는 특별한 값을 반환한다. (npos = "no position"의 줄임말)
: find를 쓰면 반드시 npos를 체크하여 버그를 놓치지 않도록 하자.
find의 두 번째 매개변수
- find의 두 번째 매개변수를 설정하면 "어디서부터 찾을지"를 지정한다.
s.find("Hello",7) // 인덱스 7부터 검색 시작
시간복잡도: 최악 O(n×m) (n: 원본 길이, m: 검색어 길이)
한글자 씩 비교해나가는 방식 - 아주 긴 문서에서 Ctrl+F가 살짝 느릴 수 있는 이유
substr - 원하는 부분만 떼어내기(부분 문자열 추출)
- s.substr(시작위치, 길이) → 일부분을 복사한 새 문자열 반환
- 두 번째 매개변수 생략 시 시작위치부터 끝까지 잘라낸다.
※ 중요: substr은 원본을 수정하지 않고 새 문자열을 만든다.
 |
s.substr(0,5) → "Hello" s.substr(6) → "World" |
- 위치를 찾고(find), 그 위치를 기준으로 잘라내기(substr)
: 실전에서 가장 많이 쓰이는 패턴이다.
 |
| find, substr 활용 예시 |
replace - 범위를 새 문자열 교체
- s.replace(시작위치, 길이, "새문자열") -> 원본을 직접 수정
 |
| replace는 substr와 달리 원본이 바뀐다. |
- replace() 한번으로는 하나만 교체된다.
: 모두 바꾸려면 루프 필요.
find + replace 루프 사용시 주의점
- 문자열 내의 모든 '특정 문자열'을 '특정 문자열이 포함된 문자열'로 변경할 때 무한루프가 되는 예외상황이 발생할 수 있다.
ex) "apple" → "pineapple" 루프
→ "apple is pineapple" →"pineapple is pineapple" → "pinepineapple is pineapple" → "pinepinepineapple …" → 무한반복
- 이를 해결하려면 pos += 새문자열.length()를 사용해야 한다.
: 이는 다음 find로 검색할 위치를 pos(이전 검색위치)+새문자열 길이부터 찾겠다는 뜻이다.
stringstream - 문자열을 여러조각으로 분리
- 문자열을 마치 입력스트림(cin) 처럼 취급해서 데이터를 하나씩 꺼낼 수 있게 해준다.

stoi() / to_string() 문자열 ↔ 숫자 변환
stoi() : "45" → 45
to_string() : 45 → "45"
문자열 "45"를 정수 45로 변환하거나 반대로 할 수 있다.
ASCII (American Standard Code for Information Interchange)
- 총 128개 문자를 7비트로 표현하는 표준
- 이를 활용해 문자에 덧셈을 해 다른 문자로 변환할 수 있다.
ex) 'A' + 1 = 65 + 1 = 66 = 'B'
isalpha(), isdigit() 같은 함수도 결국 ASCII 숫자 범위를 비교하는 것이다.
- 대소문 ↔ 소문자는 항상 32 차이
toupper('a') = 97 - 32 = 65 = 'A'
tolower('A') = 65 + 32 = 97 = 'a'
 |
| ASCII 코드표 |
유니코드
- ASCII는 128개뿐이다. 그렇다면 한글, 일본어, 이모지는?
웹에서 깨진 문자를 본 적 있다면 - 인코딩 불일치가 원인
실전예시
게임개발
- 채팅 필터링(금칙어 → 별표), 세이브/로드(직렬화 → 파싱)
- UE5의 FString: Find(), Mid(), Replace() 제공 (오늘 배운 것과 같은 이름)
웹/서버
- URL 파싱(호스트, 경로, 쿼리 분리) JSON/XML 파싱
- 서버 로그 분석: find + substr + stringstream이 기초 패턴
일반 CS
- 문자 인코딩 = 운영체제, 네트워크, 데이터베이스 모두에 영향
- 나중에 배울 해시(Hash)에서도 "문자 = 숫자"가 핵심 기초
오늘의 핵심
- string은 vector<char>의 사촌: 연속 메모리, 인덱스 접근 O(1)
여기에 문자열 전용 도구가 추가된 것
- 세가지 핵심 도구: find(찾기), substr(추출), replace(바꾸기)
이 셋의 조합으로 대부분의 문자열 처리가 가능
- find +npos 체크는 세트
find의 결과를 npos와 비교하지 않으면 버그의 원인이 된다.
- 문자는 숫자다: 'A'=65, 'a'=97
toupper / tolower는 32를 빼고 더하는 연산
- stringstream으로 분리, stoi / to_string으로 상호 변환
댓글
댓글 쓰기