C/C++를 통해서 개발할 때 키보드 입력을 받아야 할 경우가 있습니다. 주로 키보드로 입력을 받을 때는 C언어에서는 scanf, C++에서는 cin을 사용했지만, 입력된 키의 정보를 얻어 올 경우에는 getch()와 kbhit() 함수를 사용합니다. 그 이유는 scanf나 cin은 입력 시 버퍼를 사용하기 때문에 키 입력 후에 엔터키를 눌러야 입력이 마무리되지만 getch는 입력 버퍼를 사용하지 않기 때문에 키를 누름과 동시에 값이 입력된다는 점과 SPACE나 ENTER와 같은 특수 키도 입력이 가능하다는 점 때문입니다. 키보드의 입력을 받으면 데이터가 ASCII코드로 들어옵니다.
주요 아스키(ASCII) 코드 값
주요 아스키 코드값은 위와 같으니 개발 시 활용하시면 되겠습니다.
아스키코드로 표현할 수 없는 펑션키(F1, F2, F3, F4)나 방향키 (←, →, ↑, ↓)의 경우 다른 키와의 구분을 위해 두 개의 값을 반환합니다. 펑션키를 누르면 먼저 0을 반환하고 그다음에 F1(59), F2(60)과 같은 숫자를 반환하고 방향키 또한 먼저 224를 반환하고 그 다음에 ←(75), →(77), ↑(72), ↓<(80)의 숫자를 반환합니다.
getch() 함수의 단점
getch() 함수는 마지막에 누른 키 하나만을 입력받습니다. 그렇기에 두개 이상의 키를 한번에 입력받지 못하여 반응속도가 늦습니다. 또한 방향키도 두개 이상입력받지 못해 일명 "대각선 이동"이라는 모션을 취할 수 없게됩니다. 즉 게임을 개발할 목적이라면 getch() 함수의 사용보다는 멀티 입력이 가능한 GetAsyncKeyState()함수를 사용하시는것이 좋습니다. 해당함수의 사용법에 대해 궁금하시다면 아래 글을 참고해주세요.
[C언어/C++] 캐릭터 움직이기 (GetAsyncKeyState 함수 사용법)
많이 활용하는 특수 버튼
← 좌측 방향키 : 75
→ 우측 방향키 : 77
↑ 위 방향키 : 72
↓ 아래 방향키 : 80
Enter키 : 13
문자 단위로 콘솔 키보드 입력받기
#include <stdio.h>
#include <conio.h> //_getch가 포함되어있는 헤더
int main(void) {
char c;
for (;;) {
c = _getch(); //입력값 input
printf("입력 값 : %c\n", c); //입력값 출력
}
return 0;
}
getch가 포함되어있는 conio.h를 포함시킨 뒤 입력값을 input 받으시면 됩니다.
특수 버튼 콘솔 키보드 입력받기
#include <stdio.h>
#include <conio.h>
// 상하좌우 상수값 설정
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
int main(void) {
char c;
for (;;) {
if (_kbhit()) { //키보드 입력 확인 (true / false)
c = _getch(); // 방향키 입력시 224 00이 들어오게 되기에 앞에 있는 값 224를 없앰
if (c == -32) { // -32로 입력되면
c = _getch(); // 새로 입력값을 판별하여 상하좌우 출력
switch (c) {
case LEFT:
printf("왼쪽으로 이동\n");
break;
case RIGHT:
printf("오른쪽으로 이동\n");
break;
case UP:
printf("위로 이동\n");
break;
case DOWN:
printf("아래로 이동\n");
break;
}
}
}
}
return 0;
}
앞서 설명했듯 특수 버튼을 입력받으면 다른 키와의 구분을 위해 두 개의 값을 반환합니다. 가장 처음에 입력받게 되는 값을 판단하여 특수키의 종류를 판별하고 두 번째 입력값으로 특수키를 구분하시면 되겠습니다.
위의 예제에서는 kbhit함수와 getch 함수를 사용하였습니다. _kbhit() 함수는 사용자가 키보드의 입력 여부를 단순히 입력 버퍼만 확인하고 true false값을 리턴하는 함수입니다. 단순히 버퍼만 확인하기 때문에 처음 버퍼에 키보드로부터 값이 입력되고 난 뒤 버퍼를 비우지 않으면 계속 true 값을 리턴합니다. 그렇기에 _getch() 함수를 같이 써주어야 합니다. _getch함수는 버퍼에 있는 값을 그대로 출력하고 버퍼를 비워줍니다.
'Language > C , C++ , C#' 카테고리의 다른 글
[C언어/C++] 랜덤(rand)함수 활용 아이템 가챠 프로그램 (난수 생성) (0) | 2021.02.05 |
---|---|
[C언어/C++] 랜덤함수(rand, srand, time) 사용법 & 예제 (난수 생성) (1) | 2021.02.05 |
[C언어/C++] 콘솔 화면 지우기(초기화) (0) | 2021.02.03 |
[C언어/C++] 콘솔 창 색상, 크기, 제목, 폰트 색상 변경하기 (0) | 2021.02.02 |