본문 바로가기
프로그래밍/C

문자

by 길냥이 2025. 6. 7.
728x90

목차

  1. 아스키코드 값과 진수
  2. scanf 함수와 %c를 이용한 문자 입력
  3. getchar 함수와 putchar 함수

 

1. 아스키코드 값과 진수

이전에 올렸던 "상수와 데이터 표현" 편에서, 컴퓨터는 2진수만 저장한다고 배웠습니다.

그렇다면 문자는 어떻게 저장되는 걸까요?

 

문자 상수들은 아스키코드 값에 따라 달라지지만, 결국 저장은 2진수로 저장됩니다.

즉, 메모리에 저장되는 방법이 정수와 같습니다.

따라서 int형 변수나 char형 변수에 정수를 입력해도 %c로 출력하면 문자가 나온다는 거죠(물론 아스키코드 해당 값인 128까지만요)

 

아스키코드 값은 다음과 같습니다.

이건 "상수와 데이터 표현" 편에도 있어요.

보시면 알겠지만, 아스키코드 값은..

 

48 ~ 57 까지 숫자 문자 10개가

65 ~ 90 까지 알파벳 대문자가

97 ~ 122까지 알파벳 소문자가 존재해요.

그리고 나머지 제어 문자와 특수문자들까지 말이죠.

 

즉, char 변수에다 32만큼 더하거나 빼서 대문자를 소문자로, 소문자를 대문자로 바꿀 수 있습니다.

 

한번 프로그램을 짜보죠.

#include <stdio.h>

int main(void)
{
	char string[] = "apple";            //변환할 문자 입력
	int size;

	size = sizeof(string) / sizeof(string[0]);  //for문을 돌리기 위한 배열의 크기 추출
	printf("변환 이전 : %s\n", string);

	for (int i = 0; i < size; i++)   //배열의 크기만큼 돌립니다
	{
		if ('a' <= string[i] && string[i] <= 'z')  //만약 배열의 문자 하나가 a와 z값 사이라면
			string[i] -= 32;                       //32만큼 빼냅니다(대문자로 변환)
	}
	
	printf("변환 결과 : %s\n", string);

	return 0;
}

이전에도 말했지만, 문자열은 문자들의 배열입니다.

 

즉, 문자열의 string[i] 하나는 char형 배열이고, 이것을 수정하면 문자도 바꿀 수 있겠죠.

 

결과는 다음과 같습니다.

변환 이전 : apple
변환 결과 : APPLE

 

2. scanf 함수와 %c를 이용한 문자 입력

scanf 함수는 기본적으로 단어를 받는 함수입니다. 정수열이나 실수열이나 문자열이나...

이 scanf 함수에 문자를 입력할 때는 %c 변환 문자를 사용합니다.

 

%c 변환 문자는 문자를 입력받지만, 공백(space)이나 텝(tab), 개행(enter)같은 것도 받으니 주의하세요.

한번 예제를 통해 확인해보죠.

#include <stdio.h>

int main(void)
{
	char ch1, ch2;

	scanf("%c%c", &ch1, &ch2);
	printf("[%c%c]", ch1, ch2);
	return 0;
}

이 예제를 통해, Enter이나, 공백과 같은 것들도 %c가 받는 것을 알 수 있습니다.

즉, %c의 아스키코드 값은 'a'도 받고, '\n' (아스키코드 10번)도 받고, ' '(아스키코드 32번)도 받고...

그냥 아스키코드 상에 존재한다면 다 받을 수 있습니다.

 

그런데 scanf 함수는 좀 복잡합니다.

예를 들어 scanf("%d %d")가 있을 때 10 20을 입력한다면 중간에 있는 공백 문자가 이 둘을 구분해줍니다.

공백은 숫자가 될 수 없기 때문이죠.

 

scanf("%d%d")는요?

정수형 입력은 자기 알아서 공백문자(스페이스, 탭, 엔터 등)을 무시하기 때문에 사실상 동일합니다.

 

근데 문제는 이거죠. scanf("%c %c")이랑 scanf("%c%c")이 달라진답니다.

scanf("%c%c")은 위에도 말했던 것처럼 공백문자도 뒤의 %c에 들어갈 수 있지만, 

scanf("%c %c")는 공백 하나가 버퍼로 들어있기 때문에 공백문자 하나가 제거되고, 사용자는 문자를 하나 입력할 수 있게 됩니다.

 

마지막으로 하나 짚고 넘어가자면, scanf에서 %c를 사용할 때 int값에 저장한다면, int값의 4바이트 중 1바이트만 사용하므로 미리 초기화해놓는 것이 좋습니다.

아니면 그냥 char 배열이나 char을 사용하던가요.

 

3. getchar 함수와 putchar 함수

이거 전에 본거 같아요!

맞아요. 문자열에서 puts 함수와 gets 함수를 봤습니다.

저놈들이랑 비슷하지만 문자 하나만 다룬다는 차이가 있습니다.

그리고 <stdlib.h> 라이브러리가 필요없다는..

 

아무튼, 문자를 관리하는 이 함수들은 범용 입력 함수인 scanf 함수와 다르게 문자만 처리하므로 메모리를 아끼기 위해 이런 함수를 사용하는 것이 좋습니다.

 

이 함수들의 구조는 다음과 같습니다.

getchar(void);

putchar(문자);

 

그럼 한번 사용해볼까요...

#include <stdio.h>

int main(void)
{
	char string[] = "cat";  //문자열 선언

	string[0] = getchar();  //문자를 입력받음

	printf("%s\n", string);   //바뀐 문자열 출력

	putchar(string[1]);     //문자열의 두 번째 문자 출력
	putchar('\n');          //줄바꿈

	return 0;
}

출력은 다음과 같아요.

 

a
aat
a

getchar 함수는 매개변수가 없으므로 괄호만 사용해서 호출하면 됩니다. 

다만 대입할 문자가 좌항에 들어가야 합니다.

 

putchar 함수는 매개변수를 요구하므로, 출력할 문자를 사용해서 출력해야 합니다.

 

 

728x90

'프로그래밍 > C' 카테고리의 다른 글

변수 사용 영역  (0) 2025.06.10
버퍼를 사용하는 입력 함수  (0) 2025.06.09
배열을 처리하는 함수  (0) 2025.06.06
배열과 포인터의 관계  (2) 2025.06.05
포인터 이해하기  (0) 2025.06.04