C언어 대소문자 변환하여 출력하기, 아스키코드 방법, 유니코드 방법
대소문자 변환과 아스키 코드, 유니코드
사실, 대문자에서 소문자로 변환하거나 그 반대로 변환하는 것은 아스키 코드나 유니코드를 이용하는 경우가 많습니다. 대소문자 변환은 문자열 인코딩 시스템에 따라 다를 수 있는데, 아스키 코드에서는 대소문자의 차이가 일정하기 때문에 간단한 수학적 계산을 통해 할 수 있습니다.
C에서는 유니코드에 대한 기본적인 지원이 부족합니다. 지원이 부족하다고 해서 유니코드를 못쓴다는 건 아닙니다. 다만, C의 기본 문자 타입은 char이고, 이는 아스키 코드를 사용합니다. C에서 대소문자 변환을 위해서는 아스키 코드를 이용하거나, 유니 코드를 사용해야 겠다면 wchar_t 타입을 사용하여 처리할 수 있습니다. C 표준 헤더파일에서는 유니코드를 처리하는 함수들이 기본적으로 내장되어 있지 않습니다. 그러므로 유니코드를 다루려면 추가적인 헤더 파일 ( #include <wchar.h> )기능을 활용해야 합니다. 또한 영문을 출력하는데 굳이 유니코드를 불러올 필요는 없습니다. 유니코드(한국어, 중국어, 아랍어, 일본어, 이모티콘 등 ) 는 영어를 제외한 다국적 언어를 위해 만들어진 코드 입니다.
아스키 코드 대소문자 변환 (기본)
- 아스키 코드에서 대문자와 소문자 간의 차이는 일정합니다. 대문자 'A'의 아스키 값은 65, 소문자 'a'의 아스키 값은 97로, 두 값의 차이는 32입니다.
- 소문자에서 대문자로 변환하려면 아스키 코드 값에서 -32를 빼면 되고,
- 대문자에서 소문자로 변환하려면 아스키 코드 값에 +32를 더하면 됩니다.
#include <stdio.h>
int main()
{
char upper='C'; //대문자C
char lower='a'+upper-'A';
printf("%c\n", lower); // 소문자 c 출력: c
return 0;
대문자 C의 아스키 코드 값은 67입니다.
a의 아스키 코스 값은 97입니다. 대문자 A 는 소문자 a와 +32 만큼 차이가 나니 62이 되겠습니다.
저는 언어를 처음 배울 때 아니 문자에서 문자를 어떻게 빼? 라는 생각을 했습니다만 수학 공식의 표기법과는 차이가 있다고 생각하시면 이해가 쉬울 것 같습니다.
아무튼 char lower='a'+upper-'A' ▶️ char lower = 97+ 67 - 65 하시면 소문자 c의 아스키 코드 값이 나오게 됩니다.
lower = 65; 즉 소문자 c 가 출력 되게 됩니다.
위의 방법과 같이 하셔도 되고 다른 방법도 있습니다.
아스키 코드 대소문자 변환 (아스키 코드 함수 이용)
#include <stdio.h>
#include <ctype.h> // toupper() 함수 사용을 위해 필요
int main() {
char ch = 'a';
char upperCh = toupper(ch); // 'a' → 'A'
printf("%c\n", upperCh); // 출력: A
return 0;
}
toupper() 은 소문자를 대문자로 출력 하고 tolower()은 대문자를 소문자로 출력하는 함수 입니다.
#include <ctype.h> 헤더 파일 위에 명시 하는거 잊지 않고 꼭 쓰시길 바랍니다.
각 언어마다 헤더파일 같은 기능을 하는 것들이 있는데 깊게 하나 하나 따져보면 의미는 조금씩 다른 것 같지만 저는 그냥 C는 헤더파일, 파이썬은 라이브러리, 자바는 패키지로 부르고 있습니다.
반복하는 개념 정리
컴퓨터에서의 데이터 타입
1. 비트와 바이트
- 비트 (bit): 컴퓨터의 최소 저장 단위입니다.
- 8비트는 1바이트(Byte)로 정의됩니다.
2. 데이터 종류
컴퓨터에서 데이터는 그 특성에 따라 크게 숫자, 문자, 문자열로 나눌 수 있습니다. 각 데이터는 세부적으로 다양한 타입으로 분류됩니다.
✔️숫자 (Numeric Data)
숫자형 데이터는 정수와 실수로 나눌 수 있습니다.
정수형 (Integer)
정수형 데이터는 소수점 없이 숫자만을 표현합니다.
- 부호있는 정수형(Signed Integer): 양수와 음수 모두 표현
- 예: int, short, long
- 부호없는 정수형(Unsigned Integer): 양수만 표현
- 예: unsigned int, unsigned short, unsigned long
실수형 (Floating-Point)
실수형 데이터는 소수점을 포함한 숫자입니다.
- float: 단정도 실수 (4바이트)
- double: 배정도 실수 (8바이트)
- long double: 더 높은 정밀도의 실수 (메모리 크기는 시스템에 따라 다름)
✔️문자 (Character Data)
문자형 데이터는 단일 문자를 표현합니다. 보통 문자(char) 타입으로 사용됩니다.
- char: 하나의 문자를 저장하는 데이터 타입
- 예: 'A', 'z', '1' 등
- wchar_t: 유니코드 문자(Wide Character)를 표현하는 데 사용 (특히 다국어 문자 처리, #include <wchar.h> 헤더 파일 이용)
✔️문자열 (String Data)
문자열은 여러 문자가 모여 이루어진 데이터입니다. 보통 문자 배열이나 문자열 헤더파일를 이용하여 다룹니다.
- C에서의 문자열: char 배열로 처리 (마지막에 null 문자('\0')를 사용하여 문자열의 끝을 표시)
- 예: "Hello, World!"
'\0' 이게 이해가 안갔는데 우리 눈에 보이지 않지만 C 는 문자열을 배열에 저장하기에 char str[] = "Hello"; 뒤에 '\0' 이 붙어서 저장 된다고 합니다. 사람 눈엔 안보입니다. 컴퓨터가 그렇게 한답니다. 그냥 그렇구나 하고 알고있으면 될 것 같습니다.
3. 타입 (Data Type)
타입은 메모리 영역의 크기와 저장되는 데이터의 종류에 따라 구분됩니다. 이를 통해 컴퓨터는 효율적으로 데이터를 저장하고 처리할 수 있습니다.
4. 변수 (Variable)
- 변수는 이름이 붙은 메모리 영역으로, 데이터를 저장하고 읽을 수 있게 해줍니다.
- 변수 정의 형식:
타입 변수명 = 초기값;
(초기값은 생략 가능)
5. 정수형 데이터 (Integer)
- 정수형 데이터는 정수를 표현합니다.
- 정수형 타입은 메모리 크기와 부호 여부에 따라 나뉩니다.
- 부호있는 정수형(Signed): 양수와 음수를 표현할 수 있습니다.
- 부호없는 정수형(Unsigned): 양수만 표현할 수 있습니다.
6. 실수형 데이터 (Floating-Point)
- 실수형 데이터는 소수점을 포함한 수를 나타냅니다.
- 실수형에서는 부호를 기준으로 따로 분류하지 않으며, 주로 float와 double 타입을 사용합니다.
저도 공부하면서 새롭게 안 사실도 있네요. 공부를 매일 하려고 하지만 정말 하기 싫은 날엔 10분 만에 끝나기도 합니다. 대충 교재 읽고 이해도 하지 않고 그냥 끝내버리는 경우가 있습니다. 그럼에도 불구하고 하려고 했다는 데에서 저는 의미를 두려고 합니다. 그러다가 재미있는 챕터나 문법이나 개념이 나오면 10분이 15분이 되고, 15분이 30분이 되는 것이라 생각합니다. 제 좌우명이 있는데 '느려도 돼, 넘어져도 돼, 멈춰도 돼, 뒤돌아 돌아가도 돼, 포기하지만 말자'입니다. 화이팅! ( 사실 오늘은 공부하기 싫은 날🤣 드라마 보고 싶어서.. 이만 물러납니다.)
감사합니다.❤️