[C언어/C++] 키보드 입력 받기 (getch, kbhit) 함수 사용법 & 예제

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함수는 버퍼에 있는 값을 그대로 출력하고 버퍼를 비워줍니다.

댓글(0)

Designed by JB FACTORY