본문 바로가기
C

[C]kbhit(), getch(), 방향키입력

by Junk_Seo 2018. 1. 9.
반응형

kbhit()

kbhit() 함수는 키보드가 입력되었는지를 확인하는 함수이다. 즉, 입력 버퍼의 내용을 확인하여 키의 입력이 있다면 true 없다면 false를 반환한다.

kbhit() 함수의 장점은 waiting 함수가 아니라는 점이다. 만약 입력 함수를 통해 키의 입력을 확인하려고 입력 함수를 호출한 시점부터 대기 상태에 들어가서 입력이 들어올 때까지 기다리게 된다. 

하지만 kbhit() 함수의 경우 입력이 있든 없든 바로 반환하기 때문에 반환 값에 따라 작업을 진행하게 할 수 있다.

getch()

scanf_s()와 비슷하게 입력을 받는 함수이다. scanf_s()와 다른 점은 입력한 키보드의 내용이 화면에 출력되지 않는다는 점이다. 또한 Enter key를 통해 입력을 확인하지 않고 키를 누른 순간 입력 버퍼에 값이 들어가게 된다.

Header

kbhit(), getch() 함수 모두 <conio.h> header를 include 하여 사용하면 된다.

 

사용

char getKey()
{
	if (kbhit()) {
		return getch();
	}
	return '\0';
}

이렇게 함수를 정의하고 사용해도 되고 따로 사용해도 된다.

int main()
{
	BOOL bSelect = TRUE;
	char cSelect = '\0';

	while (bSelect) {
		cSelect = getKey();
		switch (cSelect)
		{
		case 's':
			printf("start \n");
			bSelect = FALSE;
			break;
		case 'r':
			printf("ranking \n");
			bSelect = FALSE;
			break;
		case 'e':
			printf("exit \n");
			bSelect = FALSE;
			break;
		default:
			break;
		}
	}
    return 0;
}

루프 안에서 s, r, e 키가 눌리면 해당 기능을 수행한다. 다른 키가 눌리거나 키를 누르지 않으면 루프를 계속 돌게 된다.

 

 

방향키 입력

방향키를 비롯한 몇몇 키들은 확장 아스키코드이기 때문에 일반 아스키코드와는 다르게 2byte를 사용하여 표현합니다.

따라서 getch() 함수를 사용하여 방향키 값을 읽어 들이면 두 번 반환하게 됩니다.

 

방향키의 아스키 값

    : 224, 72

    : 224, 80

    : 224, 75

    : 224, 77

 

따라서 getch() 함수를 사용하여 방향키 입력을 읽어올 때 처음 반환 값이 224인지를 확인하고 그다음에 반환하는 값을 확인하여 방향키 값을 구분하는 방식을 사용해야 한다.

 

int main()
{
	int nSelect = 0;
	while (1) {
		if (kbhit()) {
			nSelect = getch();
			if (nSelect == 224) {
				nSelect = getch();
				switch (cSelect)
				{
				case 72:
					//
					break;
				case 80:
					//
					break;
				case 75:
					//
					break;
				case 77:
					//
					break;
				default:
					break;
				}
			}
		}
	}
    return 0;
}

위와 같은 방식으로 사용하면 되겠다.

 

출처 : http://blog.naver.com/PostView.nhn?blogId=sharonichoya&logNo=220875372940

반응형

'C' 카테고리의 다른 글

[C]Type Casting  (0) 2018.01.11
[C]변수 const  (0) 2018.01.11
[C]gotoxy() 콘솔 커서 이동 함수(SetConsoleCursorPosition)  (0) 2018.01.09
[C/C++][함수]반환형  (0) 2018.01.08
[C][2차원배열]달팽이 배열  (0) 2018.01.02