본문 바로가기
프로그래밍/C언어.

[C언어] getchar(), getche(), getc() 차이. 간단예제.

by K_Coder 2011. 7. 10.
[C언어] getchar(), getche(), getc() 차이.
[C언어] getchar(), getche(), getc() 차이.
[C언어] getchar(), getche(), getc() 차이.

비교

getchar()

getche()

getch()

버퍼 사용

O

X

X

화면 표시

O

O

X

종료 인식

\n

\r

\r


getchar() 버퍼를 사용. 종료인식 ‘\n' 엔터치기 전까지는 입력한 내용 수정가능. 화면표시.

getche() 버퍼사용x, 종료인식 ‘\r' 한번 입력되 문자는 수정 불가. 화면 표시

getch() 버퍼사용x, 종료인식 ‘\r' 한번 입력되 문자는 수정 불가. 화면 표시 x

getch, getche 의 경우 입력하고 백스페이스를 누르면, 백스페이스 자체가 입력된다 - 0-;



기본적으로 비버퍼형인 getche 와 getch는 #include <conio.h> 를 선언해주어야 한다.


getch() 즉. 버퍼 사용 x, 화면 출력 x
코드를 실행시키면 아무 화면도 나오지 않고 커서만 깜박인다.
키보드에서 a키를 누르면. 누르자마자 아래의 출력 결과가 나타단다.
scanf() 처럼 a 키를 누르고 엔터키를 입력하지 않는다. 누르는 즉시 입력된다.
버퍼를 사용하지 않기 때문에 1글자만 입력되고. 그렇기 때문에 엔터 없이 바로 입력해 버린다.





getche() 즉. 버퍼 사용 x, 화면 출력 o
코드를 실행시키면 아무 화면도 나오지 않고 커서만 깜박인다.
키보드에서 a키를 누르면. 누르자마자 아래의 출력 결과가 나타단다. 대신 내가 입력한 키가 'a' 화면에 출력된다.
ch는 printf 함수에서 찍힌 것이고 그 앞에 a는 키보드 입력 값.
역시 버퍼를 사용하지 않기 때문에 1글자만 입력되고. 그렇기 때문에 엔터 없이 바로 입력해 버린다.







getchar() 즉. 버퍼 사용 o, 화면 출력 o
코드를 실행시키면 아무 화면도 나오지 않고 커서만 깜박인다.
이번엔 버퍼를 사용하며, 때문에 몇글자를 입력할지 모른다. 그래서 엔터를 입력할 때까지 기다린다.
화면에 출력하기 때문에 내가 입력한 키 값이 나타난다. scanf()와 거의 동일.






키보드를 누름과 동시게 printf 가 찍혀대고 버퍼를 사용하지 않아 입력한 값이 바로 나오기 때문에
한번 누르면 삭제가 불가능하다. 마지막줄에 보이듯 백스페이스 마져 찍어 버린다.
버퍼를 사용하지 않아 누르는 즉시 동작하기 때문이다.

약간의 다른 식으로 코딩을 해보자면 아래처럼 할 수도 있다.


#define을 사용하는 방법 도 있다. ESC라고 쓰지 않도 EXIT 라고 해두고
후에 마음이 바뀌어서 esc 키가 아닌 다른 키로 종료하고 싶다면 #defind에서 아스키 코드 값만 바꿔주면 된다.
지금은 코드가 짧고 간단하지만 종료하는 부분이 여러 군대 있다면. 일일이 찾아서 수정하지 않고
#defind 값만 바꿔주면 모두 저절로 바뀌는 셈이다.
#define 사용법을 모른다면 아래링크 참조.
  define란? define 사용법.




여기서 중요한 포인트. 엔터를 입력하면 종료가 되게 해볼까??


마지막 4줄에서 보이듯 엔터를 눌렀는데 종료가 되지 않는다.
왜 일까? 이유는 비버퍼형에서는 엔터를 \n 이 아닌 \r 로 인식하기 때문이다.



\r로 바꾸니까 종료가 되는 것을 볼 수 있다.

 비버퍼형 처럼 바로 동작하는 사용은 달력에서 키보드의 화살표시로 달이나 년도를 바꾸는 것.
게임처럼 내가 누른키가 누르는 즉시 수행되는 경우.
비밀번호를 입력처럼 화면에 출력되면 안되거나, 출력할 필요가 없는 경우.

화면에 입력된 값이 필요 없고 누르는 즉시 바로바로 실행해야 되는 경우에 사용한다. 아마 테트리스나 게임도?
system("cls"); 이놈으로 사용한다. windows.h 선언. 그 외 system("pause") 등도 있다.

단, c++ 에서는

iostream->ostream->ios->xlocnum->cstdlib->stdlib 를 부르는데

stdlib에 using ::system 가 있기 때문에 iostream.h 만 있어도 사용이 가능하다고 한다.


유용한 정보가 되셨다면 아래 손가락 버튼 한번 눌러주세요 ^-^