0. 들어가기 전에
C++에서 문자열 문제를 풀다 보면 대문자와 소문자를 변환해야 하는 경우가 자주 나온다.
대표적으로 특정 문자는 대문자로 만들고, 나머지는 소문자로 바꾸는 문제들이 있다.
이때 사용할 수 있는 방법은 크게 두 가지다. 하나는 C++에서 제공하는 toupper(), tolower() 함수를 사용하는 방법이고,
다른 하나는 문자 코드값을 이용해 직접 변환(ASCII)하는 방법이다.
1. toupper, tolower 기본 개념
C++에서 대소문자 변환을 할 때는 <cctype> 헤더를 사용한다.
#include<cctype>
toupper('a');// 'A'
tolower('A');// 'a'
toupper()는 소문자를 대문자로 바꿔주는 함수이고, tolower()는 대문자를 소문자로 바꿔주는 함수이다.
* 이미 대문자인 문자를 toupper()에 넣거나, 이미 소문자인 문자를 tolower()에 넣으면 문자는 그대로 유지된다. 숫자나 공백처럼 대소문자 개념이 없는 문자도 그대로 유지된다.
2. 기본 사용 예시
아래 코드는 문자 하나를 대문자 또는 소문자로 변환하는 예시이다.
#include <iostream>
#include <cctype>
using namespace std;
int main() {
char a = 'b';
char b = 'C';
cout << (char)toupper(a) << '\n'; // B
cout << (char)tolower(b) << '\n'; // c
return 0;
}
여기서 주의할 점은 toupper()와 tolower()의 반환형이 int라는 것이다. 그래서 문자처럼 출력하고 싶다면 (char)로 형변환해서 사용하는 것이 깔끔하다.
(형변환 문법 관련해서는 추후 모아서 따로 포스팅하도록 하겠다.)
3. 문자열 전체 변환 방법
toupper()와 tolower()는 문자 하나를 변환하는 함수이다. 따라서 문자열 전체를 한 번에 바꾸는 함수는 아니다.
toupper("hello");// 불가능
문자열 전체를 대문자나 소문자로 바꾸고 싶다면 반복문을 이용해서 한 글자씩 변환해야 한다.
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main() {
string s = "Hello World";
for(int i = 0; i < s.size(); i++) {
s[i] = toupper(s[i]);
}
cout << s; // HELLO WORLD
return 0;
}
이처럼 문자열의 각 인덱스에 접근해서 s[i]를 하나씩 변환하면 문자열 전체를 바꿀 수 있다.
*형변환 따로 안 해주는 이유: s[i]의 타입은 char 이기 때문에 자동 형변환(implicit casting)이 된다.
4. 함수 없이 직접 변환하는 방법(ASCII 코드 활용)
대소문자 변환은 함수를 사용하지 않고도 가능하다. 문자는 내부적으로 숫자 코드값을 가지고 있기 때문이다.
예를 들어 아스키 코드 기준으로 보면 다음과 같다.
'A' =65
'a' =97
'a'-'A' =32
// 대문자와 소문자는 32만큼 차이가 난다.
=> 그래서 소문자를 대문자로 바꾸려면 32를 빼고, 대문자를 소문자로 바꾸려면 32를 더하면 된다.
//소문자 -> 대문자
if (c >= 'a' && c <= 'z') {
c = c - 32;
}
//대문자 -> 소문자
if (c >= 'A' && c <= 'Z') {
c = c + 32;
}
5. 직접 변환(ASCII 코드 활용)을 문자열에 적용하기 예시코드
아래 코드는 문자열 전체를 대문자로 변환하는 예시이다.
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "Hello World";
for (int i = 0; i < s.size(); i++) {
if (s[i] >= 'a' && s[i] <= 'z') {
s[i] = s[i] - 32;
}
}
cout << s; // HELLO WORLD
return 0;
}
6. 언제 어떤 방법을 쓰면 좋을까?
일반적으로는 toupper()와 tolower()를 사용하는 것이 좋다. 코드의 의미가 명확하고, 가독성도 좋기 때문이다.
s[i] =toupper(s[i]);
이 코드를 보면 바로 “대문자로 바꾸는구나”라고 이해할 수 있다.
반면 직접 변환 방식은 문자 코드값을 이해하는 데 도움이 된다. 코딩테스트나 문자열 문제를 공부할 때 문자가 내부적으로 숫자처럼 처리된다는 개념을 익히기 좋다.
| 방법 | 특징 |
| toupper, tolower | 가독성이 좋고 사용하기 편함 |
| 직접 변환 | 아스키 코드 원리를 이해하기 좋음 |
7. 최종 요약
C++에서 대소문자 변환은 <cctype> 헤더의 toupper(), tolower()를 사용하면 쉽게 처리할 수 있다.
toupper('a'); // 'A'
tolower('A'); // 'a'
//반복문
for(int i = 0; i < s.size(); i++) {
s[i] = toupper(s[i]);
}
두 함수는 문자 하나를 변환하는 함수이므로 문자열 전체에 적용하려면 반복문이 필요하다.
소문자 -> 대문자 :c-32
대문자 -> 소문자 :c+32
또한 문자는 내부적으로 숫자 코드값(ASCII 코드)을 가지기 때문에 직접 변환도 가능하다.
아스키 코드 기준으로 대문자와 소문자는 32 차이가 나므로, 소문자를 대문자로 바꿀 때는 32를 빼고 대문자를 소문자로 바꿀 때는 32를 더하면 된다.
'언어 문법정리 > c++' 카테고리의 다른 글
| [C++] reverse() 함수 정리 (0) | 2026.05.16 |
|---|---|
| [C++] vector 원하는 구간만 자르기 (0) | 2026.05.16 |
| [C++] 숫자를 문자열로 변환(123 => "123") to_string() 함수 (1) | 2026.05.09 |
| [C++] max() 함수란? (0) | 2026.05.08 |
| [C++] unique 함수란? (중복제거) (0) | 2026.05.06 |
