728x90

c++에서 문자열을 찾는 방법, 즉 string에서 특정 substring을 찾는 방법은 find 함수를 사용하는 것이다.

이 함수는 쉽고 강력하지만 사용에 조금은 주의를 요하는 함수이다.


find는 총 5개로 오버로딩 되어 있다.

그 중에서도 가장 자주 쓰이는 것은 아래 같은 형태이다.


a.find("substring")

뭐 그냥 사용하면 찾아준다.

문제는 리턴값이다. 이를 별 생각없이 사용하면 문제가 생길 수 있다.


보통 find로 포함되는지 확인하고 싶다면 어떻게 써야하는가?

아마 대부분의 예제에서는 아래처럼 표현할 것이다.


#include <iostream>

using namespace std;

int main() {
string a="hi hello";

if(a.find("hi")>=0){
cout<<a.find("hi")<<endl;
}
if(a.find("hello")>=0){
cout<<a.find("hello")<<endl;
}
return 0;
}

대부분의 경우 find를 보면 >=0과 비교해서 참인지 알아낼 것이다.


왜냐하면 find함수의 리턴값은 바로 그 문자열의 위치(배열번호 위치, 즉 0번 부터 시작한다.)를 반환하기 때문이다.

그래서 >=0으로 표현하는 것이다.


여기까지는 뭐 그럭저럭 괜찮다. 그런데 문제는 문자열에 없는 경우를 짜려고 할 경우이다.

이 때 다른 언어에서는 -1을 반환하는 경우가 많기에 무의식적으로 음수라고 생각하는 경우가 있다.

그런데 cpp에서는 그렇지 않다.


#include <iostream>

using namespace std;

int main() {
string a = "hi hello";

if (a.find("sub") == string::npos) {
cout << a.find("sub") << endl;
}
return 0;
}

문자열이 매칭되지 않는것은 쌩뚱맞게도 어떤 숫자와 매핑되어 있다.

그래서 위와 같이 코드를 작성해줘야 문자열이 포함되지 않는 경우인 것이다.

출력해보면 매우 큰수로 연결되있음을 알 수 있다.


int형은 그냥 벗어난 long long형 데이터이다.


그러므로 문자열을 찾을 때 신중히 사용하여야 한다.

+ Recent posts