저는 string을 쓸 때, char *형으로 바꾸고, string.h에 있는 문자열 함수를 주로 썼습니다. 그런데, 이것도 생각보다 귀찮더라고요. 이번 시간에는 <string>의 find 함수에 대해서 알아보도록 하겠습니다. 레퍼런스에 보면 꽤 많은 원형이 있는데, 사실 둘만 알면 크게 어렵지 않아요.

 

 

size_t find(const string &s|const char *s|char ch, size_t pos = 0);

 

 

 첫 번째 인자로 string을 받거나, char형 포인터, 그러니까 문자열을 받거나, 문자 하나를 받습니다. 2번째 인자로 어느 위치에서부터 찾을 건지를 명시를 하는데요. 간단하게 말하면, string으로부터, 패턴이 매치되는 최초 위치를 찾는 함수입니다. 예제 프로그램을 보겠습니다.

 

 


 string이 다음과 같습니다. "my|pet|name|is|chogahui" 이렇게 되어 있어요. 구분자가 '|'인 경우, 문자열에서 '|'의 위치를 찾아내야 하는 것은 당연할 겁니다. 그러면, find는 어떤 값을 리턴할까요? 2번째 인자를 탐색을 시작할 위치를 나타내는데요.

 

 

 pos가 0인 경우, 맨 처음 위치부터 탐색을 합니다. 저 세 문장 모두 '|'의 최초 위치를 리턴합니다. 그림에서 보면 2번째 위치입니다.

 

 

 따라서 예제 1번은 2가 3번 출력됩니다.

 

 

 그러면, 이 경우에는 어떨까요? 저는 "pet"이 나타나는 최초 위치를 출력하고 싶습니다. "pet"은 길이가 3인 문자열입니다. 문자가 아닙니다. 따라서, const char *나, const string & 으로 받으면 될 겁니다.

 

 

 

 이 프로그램을 봅시다. 저는 t에서 "pet"이라는 패턴을 찾고 싶습니다. 이러한 문제를 '문자열에서 패턴 찾기' 라고 합니다. 문자열의 시작 위치에서부터 쭉 보았을 때, "pet"이 나타나는 첫 번째 위치를 돌려줍니다. 어디인가요?

 

 

 3번째에 있습니다. 따라서 3이 리턴됩니다.

 

 

 c언어에서 strchr도 c++ string에서는 find로, strstr도 find를 이용하면 된다는 것을 알 수 있어요. 이제 2번째 인자가 어떤 역할을 하는지 보도록 합시다.

 

 


 먼저 위 프로그램을 실행시켜 봅시다. 어떻게 나올까요? 일단, 2번째 인자에 3을 넣었는데요. 이는 string의 3번째 요소부터 선형 탐색 하라는 의미입니다. "my|pet|..."의 3번째 요소는 'p'입니다.

 

 

 따라서 군청색으로 칠한 부분은 탐색을 하지 않아요. pos = 3인, 'p'부터 search를 할 건데요. 여기서부터 쭉 search를 했을 때, '|'가 나오는 최초의 위치는 어디인가요?

 

 

 6인가요? 따라서 6을 리턴합니다.

 

 

 그러면 이 프로그램의 실행 결과는 어떻게 나올까요? 저는 t에서 "#"을 찾으려고 하는데, 아무리 찾아봐도 '#'은 없습니다. 패턴이 안 찾아지는 경우에는 -1을 돌려줍니다. 레퍼런스 사이트에서는 string::npos를 돌려준다고 되어 있어요. 그러면 이 정보들을 종합해서, t에서 '|'가 나타나는 위치를 모두 찾아봅시다.

 

 

 만약에 기준 위치에서부터 특정 패턴이 찾아지면 temp의 값은 -1이 아닐 겁니다. 그렇지 않다면 없는 것입니다. 만약에 -1이면, 빠져 나오면 됩니다. 그렇다면, temp는 '|'가 나타난 최초 위치일 겁니다. 그러면, 그 다음에, temp+1부터 찾으면 될 거에요. 11번째 줄은 그러한 일을 수행합니다.

 

 

 '|'가 있는 위치를 모두 찾아냈습니다.