🔓알고리즘/문자열
C++ | 문자열 안에서 특정 문자열 찾기
안녕하세요!!
이번에는 c++ 문자열 안에서 특정 문자열을 찾는 방법에 관하여 소스코드와 이론을 통하여 설명하겠습니다.
소스코드
#include <iostream>
#include <string>
#include <vector>
std::vector<std::size_t> findText(const std::string text, const std::string input){
std::vector<std::size_t> result;
std::size_t nPos = 0;
for(;;){
nPos = text.find(input, nPos); // text[nPos]부터 input이라는 문자열을 찾는다
if( nPos != std::string::npos ) { // 만약 찾았다면
std::string subtext = text.substr(nPos, input.size()); // 문자열쪼개기
std::cout << subtext << '(' << nPos << ')' << std::endl; // 출력
result.push_back(nPos); // 결과값 인덱스를 벡터배열에 삽입
nPos += input.size(); // 찾은 문자열의 크기만큼 더한곳부터 재탐색 시작
}
else break; // 못찾았다면 break
}
return result;
}
int main() {
const std::string text = "abcde$*fghijklmnop*&qrstuvwxyz\n####$"; // 문자열
std::string input;
std::cout << "Enter the string you want to find: ";
std::cin >> input; // 찾을 문자열 입력
auto foundText = findText(text, input); // 문자열 찾기
for(auto const& i : foundText) std::cout << i << ' '; // 찾은 문자열의 인덱스 출력
}
입력값
$
출력값
$(5)
$(35)
5 35
--------------------------------
Process exited after 1.68 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
이론및 설명
우선 이 소스코드는 생각 해보면 아주 단순하게 설계되었습니다.
차근 차근 알아보겠습니다. (엄청 간단한 부분은 그냥 생략합니다.)
nPos = text.find(input, nPos);
이 부분은 문자열을 찾는 핵심 부분입니다.
고정 문자열 text
안에서 nPos인덱스부터 input
이라는 문자열을 찾고,
찾았다면 찾은 인덱스의 번호를 반환하고 찾지 못했다면 std::string::npos
를 반환합니다.
std::string subtext = text.substr(nPos, input.size());
이 부분은 text
라는 문자열에서 nPos 인덱스번호부터 input.size()
만큼의 문자열을 쪼개는 역할을 한뒤, 그 쪼개진 문자열이 subText
로 반환되게 됩니다.
nPos += input.size();
이 부분에서 input.size()
를 더한 이유는 당연하지만,
더하지않으면 아마 반복문은 무한대적으로 해당 스코프를 무한반복 할겁니다.
이유는 당연하게도 재탐색방지
입니다.
그러면 여기서 포스팅은 마치겠습니다.
그럼 안녕~!!!!!!!!@@
'🔓알고리즘 > 문자열' 카테고리의 다른 글
split 함수 구현 - C++ (0) | 2020.12.02 |
---|---|
파일암호화 Cryptography C++ (2) | 2020.10.10 |
댓글