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 함수의 차이점을 정리한 표입니다.
getchar | getch | getche | |
---|---|---|---|
버퍼 사용 | O | X | X |
화면 표시 | O | X | O |
입력 종료 | \n | \n | \r |
putchar | putch | ||
버퍼 사용 | O | X |