2024
11.23

C++의 string 에서는 C#에서 흔히 사용되는 Tolower() 와 ToUpper()가 제공되지 않는다.

단일 문자열을 대-소문자로 전환하는 <cctype>헤더의 ::tolower가 존재할 뿐이다.

 

때문에 <algorithm>의 std::transform를 사용해 모든 문자를 순회하면서 ::tolower를 호출하면 문자를 소문자로 만들 수 있다.

[주의] transform 은 도착지의 공간을 늘려주진 않기 때문에 자기자신을 바꾸는건 같은 공간이라 상관없지만 새로운 공간으로 할당할 때는 미리 공간을 할당해야한다.

template< class InputIt, class OutputIt, class UnaryOp >
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first, UnaryOp unary_op );

 

 

std::tolower와 std::toupper는 단항 연산자기 때문에 함수를 바로 넘기면 된다.

std::transform(myString.begin(), myString.end(), myString.begin(), ::tolower);

 

예시 : 두 문자열을 대소문자 구분없이 비교하는 방법

양쪽 문자열을 transform을 사용해서 tolower로 바꿔 준 뒤, find로 위치를 검색한다.

find는 size_t형으로 위치를 반환하는데 size_t가 std::string::npos 라면 포함되지 않다는 것을 의미한다.

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(string myString, string pat) {

    std::transform(myString.begin(), myString.end(), myString.begin(), ::tolower);    
    std::transform(pat.begin(), pat.end(), pat.begin(), ::tolower);

    size_t pos = myString.find(pat);
    return pos != std::string::npos;
}

 

 

char형 변수를 대소문자 변환

std::tolower 와 std::toupper를 사용하거나 문자를 int형으로 빼주면 된다. 아스키 코드를 사용한 연산.

for (char& c : str)
{
    if (c > 'Z') // 소문자
        c = (c - 'a' + 'A');
    else
        c = (c + 'a' - 'A');
}

 

for (char& c : str) 
{
    if (std::islower(c))
        c = std::toupper(c); // 소문자는 대문자로
    else if (std::isupper(c))
        c = std::tolower(c); // 대문자는 소문자로
}

 

COMMENT