Language/C++

[C++] 문자열 변환 - 대문자/소문자 변환

nowkoes 2023. 7. 31. 02:09

문자열 변환

개요

 문자열을 대문자/소문자로 변환하는 것은 사용자의 입력을 정규화하거나, 문자열을 비교하기 위해 종종 사용된다. 사용자로부터 받은 입력은 대소문자가 섞여 있거나, 불규칙한 형태로 들어올 수 있다. 이렇게 다양한 형태로 들어온 데이터를 일관된 형식으로 변환하는 것을 정규화라고 하는데, 대문자나 소문자로 변환하는 것은 이런 정규화 작업의 일부로, 이를 통해 데이터를 일관되게 다룰 수 있게 된다.

 

 또한 대소문자를 구분하지 않은 문자열 비교를 수행할 때, 모두 대문자나 소문자로 변환하여 비교하는 것은 편리한 작업이다. 예를 들어, 사용자 이름이나 이메일 주소를 비교할 때, 대소문자를 구분하지 않도록 모두 같은 형식으로 변환한 후에 비교를 수행하면 오류를 줄일 수 있다.

 

 이번 시간에는 이러한 방법들을 살펴보는 시간을 가지도록 하자.


본문

출처: cppreference

 

 우리가 문자열을 대문자로 변환할 때 기본적으로 사용하는 std::toupper() 함수다. 이 함수는 주어진 문자를 대문자로 변경하여 반환한다. 만약 대문자나 알파벳이 아닌 문자가 전달되면, 문자를 그대로 반환한다. 

 

출처: cppreference

 

 이번에는 문자열을 소문자로 바꿀 때 기본적으로 사용하는 std::tolower() 함수다. 이 함수 또한 주어진 문자를 소문자로 변경하여 반환하고, 다른 문자가 전달되면 문자를 그대로 반환한다.

 

 먼저 반복문을 통해 문자열 전체를 검토하며 문자를 하나씩 변환하는 예제를 보자.

 

#include <iostream>
#include <string>

int main() 
{
    std::string str = "Hello, World!";
    std::cout << "Before: " << str << "\n";
    
    for (char &c : str) 
        c = std::toupper(c);
    std::cout << "touper After: " << str << "\n";
    
    for (char &c : str)
    	c = std::tolower(c);
    std::cout << "tolower After: " << str << "\n";
}

출력 결과

 

출처: cppreference

 

 다음은 std::transform() 함수를 이용하는 방법이다. C++ 표준 라이브러리에서는 주어진 범위의 원소에 대해 함수를 적용하여, 결과를 다른 컨테이너에 저장하는 std::transform() 함수가 있다. 이 함수는 원소를 변환하는 작업을 수행할 때 사용된다. 따라서 문자열 원소에 함수(대소문자 변환)를 적용할 수 있다는 점에 착안하면 다음과 같이 코드를 짤 수 있다.

 

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

int main()
{
    std::string str = "Hello, World!";
    std::cout << "Before: " << str << "\n";

    std::transform(str.begin(), str.end(), str.begin(), std::toupper);
    std::cout << "touper After: " << str << "\n";

    std::transform(str.begin(), str.end(), str.begin(), std::tolower);
    std::cout << "tolower After: " << str << "\n";
}

출력 결과

 

 여기서 주의해야 할 점은, transform 함수의 함수 호출 인자는 함수 포인터를 기입해야 한다는 점이다. C++에서 함수 이름은 해당 함수의 주소를 나타내는 함수 포인터로 사용될 수 있다. 만약 함수 포인터가 아닌 함수를 인자로 쓰고 싶다면, 다음과 같이 람다 함수를 이용해서 간접적으로 호출하는 방법이 있다.

 

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

int main()
{
    std::string str = "Hello, World!";
    std::cout << "Before: " << str << "\n";

    std::transform(str.begin(), str.end(), str.begin(),
        [](int ch) {return std::toupper(ch); }
    );
    std::cout << "touper After: " << str << "\n";

    std::transform(str.begin(), str.end(), str.begin(),
        [](int ch) {return std::tolower(ch); }
    );
    std::cout << "tolower After: " << str << "\n";
}

요약

문자열 변환
1. std::toupper(), std::tolower() 함수와 for문을 이용
2. std::transform() 함수와 문자열 변환 함수를 이용 (람다 함수 혹은 함수 포인터)
반응형

'Language > C++' 카테고리의 다른 글

[C++] 배열 내의 원소 위치 찾기 with C++  (0) 2023.08.07
[C++] 정규 표현식 with C++  (0) 2023.08.06
[C++] sort vs stable_sort with C++  (0) 2023.08.05
[C++] Python 연동 with VS code  (0) 2023.07.18
[C++] 진수 변환  (0) 2023.07.06