85.18 conio.h 함수 사용하기

conio.h 헤더 파일은 콘솔 입출력 함수를 제공하는 헤더 파일이며 MS-DOS 시절부터 사용되었습니다. 지금은 C 언어 표준도 아니고 POSIX 함수도 아닙니다. 따라서 Visual Studio에서만 사용할 수 있고 리눅스나 OS X에서는 사용할 수 없습니다.

먼저 getch 함수입니다.

  • getch();
    • int getch(void);
    • 읽은 문자를 반환

getch.c

#define _CRT_NONSTDC_NO_WARNINGS    // 비표준 함수를 사용했을 때 에러 방지
#include <stdio.h>
#include <conio.h>

int main()
{
    int c1 = getch();    // 입력 버퍼를 사용하지 않음, 화면에 키의 입력을 보여주지 않음

    printf("%c\n", c1);

    return 0;
}

소스를 컴파일한 뒤 a를 입력하세요.

실행 결과

a (입력)

getch 함수는 표준 입력에서 문자 하나를 입력받지만 stdio.h 헤더 파일의 getchar 함수와는 차이점이 있습니다. getchar 함수는 입력 버퍼를 사용하기 때문에 문자가 입력 버퍼에 들어간 뒤 엔터 키를 누르면 변수에 저장됩니다(입력한 문자가 화면에 보이는 것이 입력 버퍼). 하지만 getch함수는 입력 버퍼를 사용하지 않기 때문에 키 입력을 해도 화면에 보이지 않고 바로 변수에 저장됩니다. 여기서는 a키를 누르는 순간 문자가 c1에 저장되고 printf에서 출력됩니다.

getch 함수는 비표준 함수이기 때문에 Visual Studio 2022에서 사용하면 컴파일 에러가 발생합니다. 따라서 #define _CRT_NONSTDC_NO_WARNINGS를 지정하여 컴파일 에러가 발생하지 않도록 만듭니다. 만약 매크로를 지정하지 않으려면 getch 대신 _getch 함수를 사용하면 됩니다.

int c1 = _getch();    // 앞에 _을 붙인 _getch 함수

보통 getch 함수는 콘솔(명령 프롬프트) 창이 계속 켜져 있도록 대기할 때 사용합니다. 결과를 다 보고난 뒤 아무 키나 입력하면 콘솔 창이 닫히게 되죠.

add_getch.c

#define _CRT_NONSTDC_NO_WARNINGS    // 비표준 함수를 사용했을 때 에러 방지
#define _CRT_SECURE_NO_WARNINGS     // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <conio.h>

int main()
{
    int num1, num2;

    printf("숫자 두 개를 입력하세요: ");
    scanf("%d %d", &num1, &num2);

    printf("두 숫자의 합은 %d입니다.\n", num1 + num2);

    printf("아무 키나 입력하면 콘솔 창을 닫습니다.\n");
    getch();    // 키를 입력할 때까지 콘솔 창이 계속 켜져 있도록 만듦

    return 0;
}

숫자 1과 2를 입력하면 결과가 나오고 콘솔 창은 닫히지 않고 계속 열려 있습니다. 이 때 엔터 키를 입력하면 콘솔 창이 닫힙니다(Ctrl+F5로 실행했다면 엔터 키를 한 번 더 입력해야 함).

실행 결과

숫자 두 개를 입력하세요: 1 2 (입력)
두 숫자의 합은 3입니다.
아무 키나 입력하면 콘솔 창을 닫습니다. (엔터 입력)

getch 함수 이외에도 getche 함수가 있는데 getche 함수는 입력 버퍼를 사용하지 않지만 키의 입력을 화면에 보여준다는 차이점이 있습니다.

  • getche();
    • int getche(void);
    • 읽은 문자를 반환

getche.c

#define _CRT_NONSTDC_NO_WARNINGS    // 비표준 함수를 사용했을 때 에러 방지
#include <stdio.h>
#include <conio.h>

int main()
{
    int c1 = getche();    // 입력 버퍼를 사용하지 않음, 화면에 키의 입력을 보여줌

    printf("%c\n", c1);

    return 0;
}

소스를 컴파일한 뒤 a를 입력하세요.

실행 결과

aa

a키를 누르는 순간 getche 함수가 a를 보여준 뒤 문자를 c1에 저장하고 printf에서 출력됩니다. 여기서 getche 함수의 e는 문자를 메아리처럼 다시 들려준다고 해서 echo의 e입니다.

getch 함수와 마찬가지로 getche 함수도 비표준 함수이기 때문에#define _CRT_NONSTDC_NO_WARNINGS를 지정해야 하며 매크로를 지정하지 않으려면 getche 대신 _getche 함수를 사용하면 됩니다.

int c1 = _getche();    // 앞에 _을 붙인 _getche 함수

conio.h 헤더 파일의 출력 함수로는 putch 함수가 있는데 이 함수는 출력 버퍼를 사용하지 않고 문자 하나를 콘솔(표준 출력)에 바로 출력합니다(stdio.h 헤더 파일의 putchar 함수는 출력 버퍼를 사용).

  • putch(문자);
    • int putch(int _Ch);
    • 성공하면 출력한 문자를 반환, 실패하면 EOF(-1)를 반환

putch.c

#define _CRT_NONSTDC_NO_WARNINGS    // 비표준 함수를 사용했을 때 에러 방지
#include <stdio.h>
#include <conio.h>

int main()
{
    int c1 = 'a';

    putch(c1);    // 출력 버퍼를 사용하지 않음, 문자 하나를 화면에 출력

    return 0;
}

실행 결과

a

마찬가지로 putch 함수도 비표준 함수이기 때문에 #define _CRT_NONSTDC_NO_WARNINGS를 지정해야 하며 매크로를 지정하지 않으려면 putch 대신 _putch 함수를 사용하면 됩니다.

_putch('a');    // 앞에 _을 붙인 _putch 함수

다음은 getchar, getch, getche, putchar, putch 함수의 차이점을 정리한 표입니다.

표 85-8 getchar, getch, getche, putchar, putch 함수의 차이점
getchar getch getche
버퍼 사용 O X X
화면 표시 O X O
입력 종료 \n \n \r
putchar putch
버퍼 사용 O X