- 문자를 저장하는 변수
scanf
의 사용- Q&A
- 마치며
컴퓨터는 아무리 좋은 장비를 장착하더라도
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를 유지하면서, 새로운 문자를 추가하도록 사용되고 있습니다.
scanf
의 사용
- scanf 함수
: 화면(키보드)로부터 결과를 받아들이는 함수
: 우리가 어떤 입력을 주기 전까지 계속 기다립니다.
: 입력을 할 때는enter
를 눌러야만 입력으로 처리합니다.scanf("형식지정자", &변수);
scanf
함수는 printf
함수와 비슷한 점이 많습니다.
우선,
입력과 출력을 담당하는 기본적인 함수이며,
형식지정자와 변수를 같이 사용해야 한다는 점입니다.
하지만 scanf
함수는 printf
함수에 비해 형식지정자의 사용이 엄격합니다.
scanf
함수는 각 자료형마다 사용해야하는 형식지정자들이 정해져있습니다.
정수형
short -> %hd
int -> %d
long -> %ld
실수형
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바이트 이상의 값을 주게 된다면 버퍼 오버플로우가 발생합니다.
-
오늘은 문자의 입력에 대해 공부해봤습니다.
사실 크게 어려운 부분은 아니지만, 버퍼 오버플로우같은 내용에 대해서는 알고 있는게 좋을 것 같습니다.
scanf함수 같은 경우 보안 상의 이유로 visual studio에서 실행이 안되는데요,
scanf_s나 #define _CRT_SECURE_NO_WARNINGS
구문을 추가하면 됩니다.
[Reference] : 위 글은 다음 내용을 참고, 인용하여 만들어졌습니다.