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을 돌려줍니다.
그러면 몇 가지 도식화 된 상황을 보면서 리턴값을 이해해 보도록 하지요.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/fi5.png)
먼저 타겟 문자열 s는 “abaab”입니다. pos 인자를 주지 않았을 때, default 값으로 0입니다. 따라서, s.find를 호출하면, 회색 부분을 범위로 탐색하게 될 겁니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/fi6.png)
이제, 1번째 인자로 “ab”를 넣어 봅시다. pattern이 “ab”인가요? 결국, “abaab”에서 “ab”의 최초 위치를 찾는 것입니다. 0번째 위치에서 시작하네요? 따라서, 0이 리턴됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/fi7.png)
반대로 pos가 2인 경우에는 어떨까요? s.find(“ab”, 2)를 호출해 봅시다. 그러면 0이 나올까요? 아닙니다. 왜냐하면
- 0번째 위치는 하얀색 부분입니다.
- 즉, 탐색하지 않는 범위입니다.
그러면 어떤 값이 리턴될까요?
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/fi8.png)
당연하게도, 2번째 위치부터 탐색했을 때, “ab”를 찾은 최초의 위치 3이 리턴됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/fi9.png)
pos를 4로 준 경우는 어떨까요? s.find(“ab”, 4)의 리턴값은 어떻게 될까요? 회색 부분에서, “ab”는 찾을 수 없습니다. 따라서, -1이 리턴됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/fi1.png)
이제 예제 1번 프로그램을 봅시다. target string은 “this is ga and ga”입니다. lo와 lo2를 출력하는데요.
- lo는 target에서 “ga”를 찾습니다.
- lo2는 target에서 “ba”를 찾습니다.
“ga”는 target에 있어요. 8번째에 최초로요. 하지만, “ba”는 없지요? 따라서, 8 -1이 출력됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/fi2.png)
실행 결과는 위와 같습니다.
실전 예제
이제 c++ string find 함수를 써 봅시다. target에서 pattern이 나타나는 모든 위치를 찾으려고 해요. 단, pattern은 겹치게 나타나는 경우가 없다고 가정합시다. 예를 들어
- target이 aabaaba일 때
- pattern이 aaba이지는 않다는 의미입니다.
이는, aaba는 0번째, 3번째 위치에 나타나는데, 0 ~ 3번째와, 3 ~ 6번째가 겹치기 때문입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/fi3.png)
예제 2번 프로그램에서, while loop가 핵심입니다. 먼저, cur는 찾기 시작하려는 위치를 나타냅니다. 처음에는 전체를 봐야 하니, 0을 줘야 합니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/fi10.png)
그렇다면 문자열 전체를 탐색할 겁니다.
- find 메서드의 리턴값이 -1이면 빠져 나오면 됩니다.
- -1이 아니면 어딘가에 패턴이 있다는 의미입니다.
find의 리턴값이 -1이 아닌 경우에는 어떻게 해야 할까요?
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/fi11.png)
이 경우, 이미 패턴이 어딘가에 있단 의미입니다. 찾은 위치를 x라고 둡시다. 그러면, 그 다음에 어떤 위치부터 탐색하면 될까요?
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/fi12.png)
x에 패턴 길이를 더한 위치부터 탐색하면 됩니다. printf 밑에 있는 문장은 이를 수행합니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/08/fi4.png)
결과는 위와 같습니다.