본문 바로가기

Programming/C&CPP

C++ string (문자열) 소문자, 대문자 변환

반응형

C++ 문자열의 대문자를 소문자로 바꾸거나 소문자를 대문자로 변경해야 하는 경우가 있습니다.

문자열을 대소문자 구분없이 검색 시 대문자나 소문자로 전부 변경한 이후에 비교해서 찾을 수 있습니다.

C++에서 대문자를 소문자로 변경하거나 소문자로 대문자로 변경하는 방법을 알아보겠습니다.

 

1. boost::algorithm::to_upper, boost::algorithm::to_lower

boost는 C++을 위한 유용한 라이브러리입니다.

boost::algorithm::to_upper, boost::algorithm::to_lower를 사용하면 각각 대문자, 소문자로 변환이 가능합니다.

boost의 to_upper와 to_lower를 사용하는 방법은 다음과 같습니다.

#include <iostream>
#include <string>
#include <boost/algorithm/string.hpp>

int main()
{
    std::string str = "abcde";
    std::cout << "before: " << str << std::endl;
    boost::algorithm::to_upper(str);
    std::cout << "to_upper: " << str << std::endl << std::endl;

    std::cout << "before: " << str << std::endl;
    boost::algorithm::to_lower(str);
    std::cout << "to_lower: " << str << std::endl << std::endl;

    
    std::cout << "before: " << str << std::endl;
    str = boost::algorithm::to_upper_copy(str);
    std::cout << "to_upper: " << str << std::endl << std::endl;

    std::cout << "before: " << str << std::endl;
    str = boost::algorithm::to_lower_copy(str);
    std::cout << "to_lower: " << str << std::endl << std::endl;

    return 0;
}

to_upper()를 호출해서 대문자로 변환하고 to_lower()를 호출해서 소문자로 변환합니다.

기본적으로 이 함수들은 입력한 string의 내용을 직접 변환하기 때문에 원본이 변경됩니다.

원본을 변경하지 않고 새로운 string을 생성하려면 to_upper_copy()나 to_lower_copy()를 사용하면 됩니다.

다음과 같이 원래 값이 대문자나 소문자로 변경되는 결과가 출력됩니다.

boost::to_upper, boost::to_lower 결과

boost를 사용하는 환경에서는 이 함수들을 이용하는 것을 추천합니다.

 

2. std::toupper, std::tolower

C++에서 기본적으로 제공되는 std::toupper와 std::tolower를 사용하는 방법도 있습니다.

C++ algorithm 헤더의 transform과 함께 사용할 수 있습니다.

std::toupper와 std::tolower를 사용한 대소문자 변환 코드는 다음과 같습니다.

#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>

int main()
{
    std::string str = "abcde";
    std::cout << "before: " << str << std::endl;
    std::transform(str.cbegin(), str.cend(), str.begin(), std::toupper);
    std::cout << "to_upper: " << str << std::endl << std::endl;

    std::cout << "before: " << str << std::endl;
    std::transform(str.cbegin(), str.cend(), str.begin(), std::tolower);
    std::cout << "to_lower: " << str << std::endl << std::endl;

    
    str = "abcde";
    std::cout << "before: " << str << std::endl;
    std::string upper_str = std::string(str.length(), '\0');
    std::transform(str.cbegin(), str.cend(), upper_str.begin(), toupper);
    std::cout << "to_upper: " << upper_str << std::endl << std::endl;

    str = "ABCDE";
    std::cout << "before: " << str << std::endl;
    std::string lower_str = std::string(str.length(), '\0');
    std::transform(str.cbegin(), str.cend(), lower_str.begin(), tolower);
    std::cout << "to_lower: " << lower_str << std::endl << std::endl;

    return 0;
}

transform은 결과를 저장할 변수의 반복자(Iterator)를 지정할 수 있습니다.

아래와 같이 3 번째 인자에 동일한 문자열의 반복자를 넣어주면 원래의 문자열이 변경됩니다.

 

 

std::transform(str.cbegin(), str.cend(), str.begin(), tolower);

다른 변수에 입력하려면 반드시 원본 string의 길이와 동일한 크기로 메모리가 초기화되어야 합니다.

boost를 사용할 때와 동일하게 결과가 출력됩니다.

std::toupper, std::tolower 결과

개발 환경에 맞춰서 둘 중 원하는 방식의 대문자 ↔ 소문자 변경을 사용하면 됩니다.

반응형