본문 바로가기

Programming/C&CPP

C++ string (문자열)의 부분 문자열 추출 (substr)

반응형

C++ 문자열을 다루다 보면 문자열의 일부를 추출해야 하는 상황이 있습니다.

예를 들어, 파일의 확장자 부분만 추출하고 싶을 때 부분 문자열 추출이 필요합니다.

C++ string 클래스는 부분 문자열 추출을 위한 substr()이라는 메소드를 가지고 있습니다.

string 클래스의 substr()을 활용하는 방법을 알아보겠습니다.

 

string::substr()은 다음과 같은 형태의 함수입니다.

string substr (size_t pos = 0, size_t len = npos) const;

시작 지점(pos)과 길이(len)를 전달받아서 부분 문자열을 리턴합니다.

기본값으로 pos는 0으로 지정되어 있으며 len은 npos가 지정되어 있습니다.

len은 문자열의 마지막 문자보다 더 긴 길이가 입력되면 문자열의 마지막 문자까지만 리턴하도록 처리되어 있습니다.

그렇기 때문에 파라미터를 입력하지 않으면 기본적으로 전체 문자열을 리턴합니다.

또한 string::substr()은 항상 새로운 메모리를 할당해서 리턴합니다.

다음과 같은 예제로 동작을 확인할 수 있습니다.

#include <iostream>
#include <string>

int main()
{
    std::string numbers = "0123456789";
    std::string full = numbers.substr();
    std::string sub = numbers.substr(3, 5);
    
    std::cout << "Full String: " << full << std::endl;
    std::cout << "Sub String: " << sub << std::endl;
}

아무것도 입력하지 않고 호출하는 경우 동일한 문자열이 새로운 메모리에 할당되어 리턴됩니다.

시작 지점과 길이를 전달하면 인덱스의 시작부터 길이만큼의 문자열을 출력합니다.

실행 결과

3번째 인덱스의 값이 3(0부터 인덱스 시작)이고 3을 포함해서 5개의 부분 문자열을 출력합니다.

또한 다음과 같이 find()나 rfind()와 결합해서 파일의 이름과 확장자를 분리할 수 있습니다.

int main()
{
    std::string path = "file.txt";
    std::size_t pos = path.rfind('.');

    std::string filename = path.substr(0, pos);
    std::string extension = path.substr(pos + 1);

    std::cout << "Filename: " << filename << std::endl;
    std::cout << "Extension: " << extension << std::endl;
}

string의 rfind는 뒤에서부터 문자를 찾아서 위치를 리턴해주는 함수입니다.

여기서는 4를 리턴하며 시작부터 4개의 문자열을 substr()로 가져오면 파일 이름을 리턴합니다.

그리고 5번째 위치부터 전체를 가져오면 파일의 확장자를 리턴합니다.

실행 결과

이것은 예제이기 때문에 실제 파일에 적용하려면 확장자가 없는 파일 등에 대한 예외 처리가 필요합니다.

C++ string의 substr()을 통해 쉽게 부분 문자열 추출이 가능합니다.

반응형