이 글에서는 C++의 string 라이브러리 함수를 활용하여 메인 문자열 안에 부분 문자열이 포함되어 있는지 확인하고, 해당 부분 문자열이 나타나는 모든 위치를 찾는 방법을 살펴봅니다.
find() 함수를 이용한 부분 문자열 검색
C++ 표준 라이브러리에서 제공하는 find() 함수를 사용하면 메인 문자열 내에서 부분 문자열이 등장하는 위치를 손쉽게 찾을 수 있습니다. find() 함수는 문자열이 처음 발견된 위치(인덱스)를 반환하며, 두 번째 인자로 검색 시작 위치를 지정할 수 있습니다.
검색 결과가 존재하면 해당 위치가 반환되지만, 부분 문자열을 찾지 못한 경우에는 string::npos라는 특수한 상수가 반환됩니다. 따라서 부분 문자열의 포함 여부를 확인하려면 find()의 반환값이 string::npos인지 아닌지를 검사하면 됩니다.
모든 일치 항목을 찾기 위해서는 find() 함수를 반복적으로 호출해야 하며, 각 검색의 시작 위치를 이전에 발견된 인덱스 다음 칸으로 이동시키면 됩니다.
입력: 메인 문자열 "aabbabababbbaabb", 부분 문자열 "abb" 출력: 부분 문자열이 발견된 위치들 [1, 8, 13]
알고리즘
String_Find(main_str, sub_str)
입력 − 검색 대상인 메인 문자열과 확인할 부분 문자열
출력 − 메인 문자열 내에서 부분 문자열이 발견된 모든 위치
pos := 0 while (index = pos부터 문자열 끝까지 범위에서 sub_str의 첫 번째 등장 위치)를 구했으면 do index 출력 (일치 항목 존재) pos := index + 1 done
예제 코드
#include <iostream>
using namespace std;
int main() {
string str1 = "aabbabababbbaabb";
string str2 = "abb";
int pos = 0;
int index;
while((index = str1.find(str2, pos)) != string::npos) {
cout << "일치 항목 발견 위치: " << index << endl;
pos = index + 1; // 다음 검색은 발견된 인덱스의 바로 다음 요소부터 시작
}
return 0;
}실행 결과
일치 항목 발견 위치: 1 일치 항목 발견 위치: 8 일치 항목 발견 위치: 13
참고: C++23의 contains() 함수
C++23부터는 std::string::contains() 멤버 함수를 사용하여 부분 문자열의 포함 여부를 더욱 직관적으로 확인할 수 있습니다.
if (str1.contains(str2)) {
cout << "부분 문자열이 포함되어 있습니다.";
}다만 단순 포함 여부뿐 아니라 일치하는 모든 위치가 필요한 경우에는 위에서 소개한 find() 반복 방식이 가장 널리 사용되며, 이전 버전의 컴파일러와도 호환성이 뛰어납니다.