🔓알고리즘/문자열

C++ | 문자열 안에서 특정 문자열 찾기

Mawile 2021. 10. 17.
728x90

안녕하세요!!

이번에는 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() 를 더한 이유는 당연하지만,
더하지않으면 아마 반복문은 무한대적으로 해당 스코프를 무한반복 할겁니다.

이유는 당연하게도 재탐색방지 입니다.

 

 

 

그러면 여기서 포스팅은 마치겠습니다.

그럼 안녕~!!!!!!!!@@

 


728x90

'🔓알고리즘 > 문자열' 카테고리의 다른 글

split 함수 구현 - C++  (0) 2020.12.02
파일암호화 Cryptography C++  (2) 2020.10.10

댓글