c++ string find 는 target string에서 최초로 나타나는 pattern의 위치를 찾습니다. 비슷한 함수로 아래와 같은 것들이 있습니다.
- find [현재글]
- find_first_of
이 둘이 다른 점은 find는 문자열 안에 다른 문자열이 있는지 찾습니다. first_find_of는 delimeter에 들어있는 하나의 single character를 찾습니다. 이는 추후에 알아보도록 하겠습니다.
함수에 대한 설명
find 함수는 아래와 같이 씁니다.
- 1번째 인자로 string이나, char형 포인터, char를 받는다고 되어 있습니다.
- 문자열을 받는다고 생각하시면 편하겠습니다.
- pattern으로 생각하시면 됩니다.
- 2번째 인자는
- target 문자열의 어느 위치부터 찾을 것인지를 의미합니다.
- 주어지지 않는 경우 default 값으로 0입니다.
- 리턴값
- 찾은 경우, 최초로 찾은 위치를, 그렇지 않으면 -1을 돌려줍니다.
그러면 몇 가지 도식화 된 상황을 보면서 리턴값을 이해해 보도록 하지요.
먼저 타겟 문자열 s는 “abaab”입니다. pos 인자를 주지 않았을 때, default 값으로 0입니다. 따라서, s.find를 호출하면, 회색 부분을 범위로 탐색하게 될 겁니다.
이제, 1번째 인자로 “ab”를 넣어 봅시다. pattern이 “ab”인가요? 결국, “abaab”에서 “ab”의 최초 위치를 찾는 것입니다. 0번째 위치에서 시작하네요? 따라서, 0이 리턴됩니다.
반대로 pos가 2인 경우에는 어떨까요? s.find(“ab”, 2)를 호출해 봅시다. 그러면 0이 나올까요? 아닙니다. 왜냐하면
- 0번째 위치는 하얀색 부분입니다.
- 즉, 탐색하지 않는 범위입니다.
그러면 어떤 값이 리턴될까요?
당연하게도, 2번째 위치부터 탐색했을 때, “ab”를 찾은 최초의 위치 3이 리턴됩니다.
pos를 4로 준 경우는 어떨까요? s.find(“ab”, 4)의 리턴값은 어떻게 될까요? 회색 부분에서, “ab”는 찾을 수 없습니다. 따라서, -1이 리턴됩니다.
이제 예제 1번 프로그램을 봅시다. target string은 “this is ga and ga”입니다. lo와 lo2를 출력하는데요.
- lo는 target에서 “ga”를 찾습니다.
- lo2는 target에서 “ba”를 찾습니다.
“ga”는 target에 있어요. 8번째에 최초로요. 하지만, “ba”는 없지요? 따라서, 8 -1이 출력됩니다.
실행 결과는 위와 같습니다.
실전 예제
이제 c++ string find 함수를 써 봅시다. target에서 pattern이 나타나는 모든 위치를 찾으려고 해요. 단, pattern은 겹치게 나타나는 경우가 없다고 가정합시다. 예를 들어
- target이 aabaaba일 때
- pattern이 aaba이지는 않다는 의미입니다.
이는, aaba는 0번째, 3번째 위치에 나타나는데, 0 ~ 3번째와, 3 ~ 6번째가 겹치기 때문입니다.
예제 2번 프로그램에서, while loop가 핵심입니다. 먼저, cur는 찾기 시작하려는 위치를 나타냅니다. 처음에는 전체를 봐야 하니, 0을 줘야 합니다.
그렇다면 문자열 전체를 탐색할 겁니다.
- find 메서드의 리턴값이 -1이면 빠져 나오면 됩니다.
- -1이 아니면 어딘가에 패턴이 있다는 의미입니다.
find의 리턴값이 -1이 아닌 경우에는 어떻게 해야 할까요?
이 경우, 이미 패턴이 어딘가에 있단 의미입니다. 찾은 위치를 x라고 둡시다. 그러면, 그 다음에 어떤 위치부터 탐색하면 될까요?
x에 패턴 길이를 더한 위치부터 탐색하면 됩니다. printf 밑에 있는 문장은 이를 수행합니다.
결과는 위와 같습니다.