getch( ) / getche( ) 대체 함수 구현

getch( ) / getche( )함수는 WINDOWS / DOS화면에서 Enter key를 누르지 않고 한 글자만 누르면 바로 반응하는 함수입니다. getch( )함수는 화면에 입력된 key 값을 보여주지 않고 입력을 하고, getche( )는 화면에 입력 내용을 보여줍니다.

이들 함수는 DOS프로그램에서는 conio.h (Console Input / Output)에 포함된 함수입니다.

이들 함수는 LINUX의 Terminal에서도 유용한 함수이며, LINUX에서는 curses.h 파일에서 이들 함수가 있습니다.

그러나 curses.h 파일은 Terminal 전체를 제어하면서 사용하므로 단순히 key입력뿐만 아니라 화면에 출력하는 것들도 모두 curses.h 파일에서 제공하는 함수들을 사용하는 등 약간 복잡합니다. 기존의 함수들은 그냥 사용하면서 간단하게 key 입력하는 부분만 getch( ) / getche( )를 사용하고 싶은 경우에 대해서는 이들 함수를 재정의해서 사용합니다.

 

getkey( )

int getkey(int is_echo);

이 함수는 Enter key를 누르지 않고 key를 누르자마자 한 개의 문자를 입력하는 함수입니다. 이 함수는 DOS에서 getch( ) / getche( ) 함수의 기능을 통합한 함수입니다. is_echo가 0이면 화면에 입력된 값을 출력하지 않고, 0이 아닌 값이면 화면에 입력된 내용을 출력합니다.

 

파라미터

is_echo
   0  : keyboard의 key를 눌렀을 때, 누른 키 값을 화면에 표시하지 않고 return합니다.
   0 아닌 값 : keyboard의 key를 눌렀을 때, 누른 키 값을 화면에 표시하고 return합니다.

 

RETURN

누른 키 값을 return합니다.

 

 


getkey( )함수 소스

#include <termios.h>

int getkey(int is_echo) 
{
    int ch;
    struct termios old;
    struct termios current;

    /* 현재 설정된 terminal i/o 값을 backup함 */
    tcgetattr(0, &old);
    
    /* 현재의 설정된 terminal i/o에 일부 속성만 변경하기 위해 복사함 */
    current = old; 

    /* buffer i/o를 중단함 */
    current.c_lflag &= ~ICANON; 
    
    if (is_echo) {  // 입력값을 화면에 표시할 경우
        current.c_lflag |= ECHO; 
    } else {        // 입력값을 화면에 표시하지 않을 경우
        current.c_lflag &= ~ECHO;
    }
    
    /* 변경된 설정값으로 설정합니다.*/
    tcsetattr(0, TCSANOW, &current);
    ch = getchar();
    tcsetattr(0, TCSANOW, &old);

    return ch;
}

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

Tag ,

댓글을 달아 주세요