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); // 대문자는 소문자로
}
'🌍 C++ Study > C++ 기초' 카테고리의 다른 글
C++ std::unique 중복 요소 제거 (0) | 2024.11.26 |
---|---|
C++ string 공백으로 자르기 split stringstream (0) | 2024.11.25 |
C++ 부분 문자열 찾기std::string::find (0) | 2024.11.23 |
C++ std::transform 각 원소에 연산하기, vector 2배하기 (0) | 2024.11.21 |
C++ 역방향 반복자 rbegin() / rend() / base() (0) | 2024.11.20 |