[C] 4. 문자 입력 받기

Wonder_Land🛕·2022년 7월 13일
0

[C]

목록 보기
4/18
post-thumbnail
  1. 문자를 저장하는 변수
  2. scanf의 사용
  3. Q&A
  4. 마치며

1. 문자를 저장하는 변수

컴퓨터는 아무리 좋은 장비를 장착하더라도
0과 1말고는 처리할 수 없습니다.

그렇다면 우리가 사용하는 다양한 숫자, 문자는 어떻게 처리할 수 있을까...

그건 바로, 각 문자들을 숫자에 대응시키는 것입니다.

C에서 문자를 저장하는 변수는 char 타입의 변수입니다.

#include <stdio.h>

int main(void) {
	char a = 'a';
	printf("a : %c", a);
	return 0;
}

[Result]
a : a

위의 예제의 printf문에서 보면 형식 지정자로 %c를 사용했습니다.

컴퓨터는 a가 문자라는 것 자체를 모르기 때문에, 형식 지정자로 a를 문자로서 출력하도록 했습니다.

만약 %d로 지정했다면, a에 대응하는 정수값을 출력했을 겁니다.

컴퓨터에서는 각 문자에 대응하는 숫자를 'ASCII Code'를 이용해 다루고 있습니다.

  • ASCII Code(아스키 코드)
    : 미국 표준 학회(ASA)에서, 8비트 데이터를 이용하여 여러 문자에 번호를 붙인 코드

하지만 시간이 지나면서 조금 더 많은 종류의 문자가 필요해지자,
유니 코드(Unicode)라는 새로운 형식의 문자 체계를 도입했습니다.

  • Unicode(유니코드)
    : 한 문자를 1에서 4바이트까지 다양한 길이로 처리하는 문자 체계

유니코드는 기존 ASCII Code를 유지하면서, 새로운 문자를 추가하도록 사용되고 있습니다.


2. scanf 의 사용

  • scanf 함수
    : 화면(키보드)로부터 결과를 받아들이는 함수
    : 우리가 어떤 입력을 주기 전까지 계속 기다립니다.
    : 입력을 할 때는 enter를 눌러야만 입력으로 처리합니다.
scanf("형식지정자", &변수);

scanf함수는 printf함수와 비슷한 점이 많습니다.

우선,
입력과 출력을 담당하는 기본적인 함수이며,
형식지정자와 변수를 같이 사용해야 한다는 점입니다.

하지만 scanf함수는 printf함수에 비해 형식지정자의 사용이 엄격합니다.

scanf함수는 각 자료형마다 사용해야하는 형식지정자들이 정해져있습니다.

  1. 정수형
    short -> %hd
    int -> %d
    long -> %ld

  2. 실수형
    float -> %f
    double -> %lf

이런식으로 말이죠.

#include <stdio.h>

int main(void) {
	char c;

	short s;
	int i;
	long l;

	float f;
	double d;
	
    // 문자
	printf("char variable -> ");
	scanf("%c", &c);	// char

	// 정수형 변수
	printf("short variable -> ");
	scanf("%hd", &s);	//short
	printf("int variable -> ");
	scanf("%d", &i);	//int
	printf("long variable -> ");
	scanf("%ld", &l);	//long

	// 실수형 변수
	printf("float variable -> ");
	scanf("%f", &f);	//flaot
	printf("double variable -> ");
	scanf("%lf", &d);	//double

	printf("char -> %c\n", c);
	printf("int -> %d %d %d\n", s, i, l);
	printf("float -> %f %f", f, d);

	return 0;
}

[Result]
char variable -> a
short variable -> 1
int variable -> 2
long variable -> 3
float variable -> 4.5
double variable -> 4.5
char -> a
int -> 1 2 3
float -> 4.500000 4.500000

scnaf함수를 사용할 때 주의해야하는 점이 있습니다.

바로 버퍼 오버플로우(Buffer Overflow)입니다.

  • 버퍼 오버플로우(Buffer Overflow)
    : 프로그램이 실행될 때, 입력받는 값이 buffer를 초과하여 buffer 이후의 공간을 침범하는 현상입니다.
    : 주로, 입력받는 값이 buffer보다 클 때, 사용자가 임의로 프로그램의 메모리 값을 변조할 때 발생합니다.
    : 주로 Stack에서 발생하기 때문에 스택 오버플로우(Stack Overflow)라고도 불립니다.

위의 예제에서도,
ch는 char 타입으로 최대 1바이트 크기를 차지합니다.
하지만 입력으로 한글과 같이 2바이트 이상의 값을 주게 된다면 버퍼 오버플로우가 발생합니다.


3. Q&A

-


4. 마치며

오늘은 문자의 입력에 대해 공부해봤습니다.

사실 크게 어려운 부분은 아니지만, 버퍼 오버플로우같은 내용에 대해서는 알고 있는게 좋을 것 같습니다.

scanf함수 같은 경우 보안 상의 이유로 visual studio에서 실행이 안되는데요,
scanf_s나 #define _CRT_SECURE_NO_WARNINGS 구문을 추가하면 됩니다.

[Reference] : 위 글은 다음 내용을 참고, 인용하여 만들어졌습니다.

profile
아무것도 모르는 컴공 학생의 Wonder_Land

0개의 댓글