나만의 작은 도서관

[문자열] 특정 문자열 찾기 find(), 문자열 부분 교체 replace() 본문

C++/문법 및 메소드(STL)

[문자열] 특정 문자열 찾기 find(), 문자열 부분 교체 replace()

pledge24 2023. 6. 24. 23:41

백준 문제를 풀다보면 문자열의 패턴을 변경하거나 찾는 문제를 볼 수 있다. 문자열 문제는 특징 상, 푸는 방식을 알아도 마땅한 함수를 알지 못하면 틀릴 수 밖에 없는 일명 "모르면 틀려야지" 문제 유형이다. 따라서, 문자열 문제를 풀기 위해선 위 두 함수에 대한 이해가 필요하다.

 

replace(), find() 함수는 <string>헤더파일에 존재하는 함수로, 이 두 함수를 사용하기 위해선 <string>헤더파일을 추가해야 한다.

 

find()

// find(찾는 문자열)

basic_string<_CharT, _Traits, _Alloc>::
    find(const _CharT* __s, size_type __pos, size_type __n) const{
    ...
}

문자열에서 파라미터로 입력한 문자열의 위치를 찾는다. 문자열을 찾았다면 찾은 문자열의 시작 위치를 반환하고, 문자열을 찾지 못했다면 string::npos를 리턴한다(쓰레기값 나옴).

 

Tip) string::npos 에서 npos는 "no position"을 의미한다.

 

find() 함수 예제

#include <iostream>
#include <string>			// string::find()

using namespace std;

int main() {

	string src = "abccc";
	string FindingWord = "ccc";

	// find(찾는 문자열)
	if (src.find(FindingWord) != string::npos) {							
		cout << "해당 문자열을 찾았습니다." << endl;
	}
	else {
		cout << "해당 문자열이 존재하지 않습니다." << endl;
	}
			
	return 0;
}

 

위의 예제에서 Findingword가 src 문자열에 존재하는 문자열이라면 "해당 문자열을 찾았습니다." 문구가 출력되고, 없는 문자열이면 "해당 문자열이 존재하지 않습니다."가 출력된다.

 

replace()

// replace(문자열 시작 위치, 변경할 문자열 길이, 치환할 문자열)
basic_string&
      replace(size_type __pos, size_type __n, const basic_string& __str)
      { return this->replace(__pos, __n, __str._M_data(), __str.size()); }

문자열의 pos ~ pos + n까지의 문자열을 str 문자열로 교체한 문자열로 변경한다.

replace() 함수 예제

#include <iostream>
#include <string>			// string::replace

using namespace std;

int main() {

	string src = "abccc";
	string tgt = "ddd";

	cout << "Before: " << src << endl;

	// replace(문자열 시작 위치, 변경할 문자열 길이, 치환할 문자열)
	src.replace(2, 3, tgt);					

	cout << "After: " << src << endl;

	return 0;
}

출력

Before: abccc
After: abddd

위의 예제에서 문자열 시작 위치 2번째(0부터 세니 3번째 문자인 'c'를 가리킨다.)부터 3개의 문자를 tgt로 변경하였다.

 

문자열에서 특정 문자열을 찾고, 치환한 횟수를 출력하는 예제

 

문자열 src에 있는 ab라는 패턴의 문자열을 XX로 치환하고 치환한 횟수를 출력하고자 한다.

#include <iostream>
#include <string>			// string::find(), string::replace(), string::length()

using namespace std;

int main() {

	string src = "abcabcabc";
	string tgt = "XX";
	string FindingWord = "ab";

	cout << "Before: " << src << endl;

	int cnt = 0;
	while (src.find(FindingWord) != string::npos) {
		cnt++;

		cout << "해당 문자열을 찾았습니다. 찾은 횟수: " << cnt << endl;

		// 문자열 치환.
		// src.replace(문자열 시작 위치, 변경할 문자열 길이, 치환할 문자열)
		src.replace(src.find(FindingWord), FindingWord.length(), tgt);
	}

	cout << "After: " << src << endl;
	cout << "총 치환한 횟수: " << cnt << endl;

	return 0;
}

 

결과

Before: abcabcabc
해당 문자열을 찾았습니다. 찾은 횟수: 1
해당 문자열을 찾았습니다. 찾은 횟수: 2
해당 문자열을 찾았습니다. 찾은 횟수: 3
After: XXcXXcXXc
총 치환한 횟수: 3