C언어에는 키보드나 파일로부터 문자 하나를 입력받는 여러 가지 함수가 있습니다. getc(), getchar(), getch(), getche()는 모두 문자를 입력받는다는 공통점이 있으며, 각 함수는 정수형 값을 반환하여 입력의 상태 코드를 함께 알려줍니다.
겉보기에는 비슷해 보이지만, 입력 스트림의 범위와 버퍼 사용 여부, 화면 출력(에코) 방식에서 중요한 차이가 있습니다. 이번 글에서는 네 함수의 특징과 차이점을 하나씩 살펴보겠습니다.
1. getc() 함수
getc()는 모든 종류의 스트림(파일, 표준 입력 등)으로부터 문자를 읽을 수 있는 범용 함수입니다. 파일 포인터를 인자로 받기 때문에 키보드뿐 아니라 임의의 파일에서도 문자를 읽어올 수 있으며, 읽기에 실패하거나 파일의 끝에 도달하면 EOF를 반환합니다.
문법
int getc(FILE *stream);
2. getchar() 함수
getchar()는 표준 입력(stdin)으로부터만 문자를 읽을 수 있습니다. 인자를 받지 않으며, 내부적으로 버퍼를 사용하기 때문에 사용자가 엔터 키를 눌러야 입력이 처리됩니다.
문법
int getchar();
3. getch() 함수
getch() 역시 표준 입력으로부터 문자를 읽지만, 버퍼를 사용하지 않는다는 점이 큰 차이입니다. 따라서 사용자가 키를 누르는 즉시 값을 반환하며, 엔터 키를 기다리지 않습니다. 또한 입력된 문자가 화면에 표시되지 않아 비밀번호 입력 등에 활용됩니다. 이 함수는 <conio.h> 헤더에 정의되어 있으며, 주로 Windows 환경에서 사용됩니다.
문법
int getch();
4. getche() 함수
getche()는 getch()와 거의 동일하게 동작합니다. 표준 입력에서 문자를 읽고, 버퍼 없이 즉시 반환하며 엔터 키를 기다리지 않습니다. 유일한 차이점은 입력된 문자를 화면에 그대로 출력(echo)한다는 것입니다. 함수 이름 끝의 'e'가 바로 'echo'를 의미합니다.
문법
int getche();
예제 코드
네 함수를 한 번에 비교할 수 있는 간단한 예제입니다.
#include <stdio.h>
#include <conio.h>
int main() {
printf("%c", getc(stdin));
printf("%c", getchar());
printf("%c", getch());
printf("%c", getche());
return 0;
}실행 결과
A, B, C, D를 순서대로 입력했을 때의 출력 결과는 다음과 같습니다.
A B C D EE
출력 결과를 보면 getc()와 getchar()는 버퍼 방식으로 동작하고, getch()는 화면에 아무것도 표시하지 않으며, 마지막 줄의 "EE"처럼 getche()만 입력한 문자를 화면에 에코하는 것을 확인할 수 있습니다.
정리: 핵심 차이점 비교
- getc(): 모든 스트림에서 문자 읽기 가능, 실패 시 EOF 반환
- getchar(): 표준 입력 전용, 버퍼 사용(엔터 키 필요)
- getch(): 표준 입력 전용, 버퍼 미사용, 즉시 반환, 화면 출력 없음
- getche(): getch()와 동일하지만 입력 문자를 화면에 출력함