目次
1. getchar 함수란 무엇인가?
getchar
함수는 C 언어에서 기본적인 입력 처리 중 하나로, 표준 입력으로부터 1문자를 읽어들입니다. 이 함수는 사용자가 키보드에서 문자를 입력한 후, 해당 문자의 ASCII 코드를 반환하므로, 간단한 입력 처리를 하고 싶을 때 유용합니다. 예를 들어, 사용자가 입력한 문자를 하나씩 처리하는 경우에 사용됩니다.getchar 함수의 특징
- 표준 입력으로부터 1문자를 가져옴: 키보드 입력이 확정될 때까지 대기하고, Enter 키가 눌린 후에 처리를 시작합니다.
- ASCII 코드를 반환: 가져온 문자는 그대로가 아니라 ASCII 코드로 반환됩니다. 문자로 다루기 위해서는 캐스팅이 필요합니다.
getchar
는 특히 간단한 사용자 입력 처리와 대화형 프로그램에 최적입니다. 다른 입력 함수와 비교해도 사용하기 쉬운 점이 많아 C 언어 학습 초기 단계에 자주 사용됩니다.사용 예
다음은getchar
를 사용한 간단한 입력 예시입니다.#include <stdio.h>
int main() {
int c;
printf("문자를 입력하세요: ");
c = getchar();
printf("입력한 문자: %c\n", c);
return 0;
}
이 프로그램에서는 사용자가 키보드에서 입력한 1문자를 가져와, 그 문자를 화면에 표시합니다. 실제 출력 결과는 예를 들어 “A”를 입력했을 때 다음과 같습니다.문자를 입력하세요: A
입력한 문자: A
2. getchar 함수의 기본적인 사용법
기본적인 호출 방법
getchar
함수는 다음과 같이 호출됩니다。int getchar(void);
이는 인자를 받지 않고, 1문자를 가져와 그 문자의 ASCII 코드를 반환합니다. 반환값은 정수형(int
)이며, 오류가 발생한 경우 EOF
(End Of File)를 반환합니다。단순한 문자 입력 예시
위의 사용 예에서는getchar
를 사용해 1문자를 가져오고, 그 문자를 화면에 표시했습니다. 이처럼 getchar
는 1문 할 경우에 편리합니다。#include <stdio.h>
int main() {
int c;
printf("문자를 입력하세요: ");
c = getchar();
printf("입력한 문자: %c
", c);
return 0;
}
이 코드에서는 입력된 문자가 getchar
함수에 의해 읽혀지고, printf
를 사용하여 표시됩니다.3. getchar의 응용 예
EOF(파일의 끝)와 getchar
getchar
함수는 단순히 문자를 가져오는 것뿐만 아니라, 입력의 끝에 도달했을 때 EOF
(End Of File)를 반환합니다. 예를 들어, 파일에서의 입력이나 표준 입력에서 “Ctrl+Z”(Windows인 경우) 또는 “Ctrl+D”(Unix인 경우)를 입력함으로써 EOF를 감지할 수 있습니다. 다음 예시는 EOF가 입력될 때까지 문자를 계속 읽는 프로그램입니다。#include <stdio.h>
int main() {
int c;
printf("문자를 입력하세요(EOF로 종료): ");
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
이 코드는 getchar
함수와 putchar
함수를 사용하여 입력된 문자를 그대로 화면에 출력합니다. EOF가 입력될 때까지 문자 입력을 계속할 수 있습니다.다중 문자 입력
getchar
를 사용하여 여러 문자를 읽는 것도 가능합니다. 아래 코드에서는 개행 문자가 입력될 때까지 모든 문자를 하나씩 표시합니다。#include <stdio.h>
int main() {
int c;
printf("문자열을 입력하세요: ");
while ((c = getchar()) != 'n') {
printf("입력된 문자: %c", c);
}
return 0;
}
이 프로그램은 getchar
로 한 문자씩 가져와 화면에 표시합니다. 'n'
(개행 문자)이 입력될 때까지 루프가 계속됩니다.
4. EOF와 버퍼 처리
EOF의 역할
EOF(End Of File、파일 및 표준 입력의 끝을 의미합니다。getchar
함수는 EOF에 도달하면 -1
을 반환하고, 프로그램이 이를 감지하여 처리를 종료할 수 있습니다。EOF는 일반적으로 파일의 끝을 나타내는 데 사용되지만, 키보드 입력의 경우 특별한 키 조작으로 EOF를 전송할 수 있습니다。버퍼링과 getchar
getchar
함수는 입력이 버퍼링되기 때문에 사용자가 입력한 모든 문자가 버퍼에 저장됩니다。예를 들어, getchar
를 여러 번 호출하면 버퍼에 저장된 다음 문자가 반환됩니다。이 때문에 개행 문자가 입력될 때까지 프로그램이 다음 처리로 진행하지 않을 수 있습니다。 버퍼 내의 개행 문자를 무시하기 위해서는 다음과 같은 처리를 추가할 수 있습니다。#include <stdio.h>
int main() {
int c;
printf("문자를 입력하세요: ");
c = getchar();
while (getchar() != 'n'); // 버퍼에 남은 개행 문자를 무시
printf("입력된 문자: %c\n", c);
return 0;
}
이 코드는 입력된 문자가 표시되기 전에 개행 문자가 버퍼에서 읽히는 것을 방지하기 위한 예시입니다。5. getchar 함수와 다른 입력 함수와의 비교
getchar와 scanf의 차이
getchar
와scanf
는 모두 입력을 받기 위한 함수이지만, 사용 방법과 적용 상황에는 큰 차이가 있습니다.scanf
는 포맷 지정자를 사용하여 정수, 부동소수점, 문자열 등 다양한 데이터 타입을 입력할 수 있습니다. 반면,getchar
는 표준 입력으로부터 한 문자를 얻는 간단한 함수입니다。scanf를 사용한 입력 예시:
#include <stdio.h>
int main() {
int num;
printf("숫자를 입력하세요: ");
scanf("%d", &num);
printf("입력한 숫자: %dn", num);
return 0;
}
이 코드에서는,scanf
를 사용하여 정수 값을 입력하고, 이를 표시합니다. 이처럼,scanf
는 여러 데이터 타입을 지원하며, 여러 값을 한 번에 얻을 수 있습니다。getchar와 fgets의 차이
fgets
는getchar
와 달리 여러 문자(문자열)를 한 번에 읽어들일 수 있습니다. 이는 표준 입력으로부터 문자열을 읽을 때 매우 편리합니다. 또한,fgets
는 버퍼 크기를 지정할 수 있어,scanf
와 같이 버퍼 오버플로우 위험을 피할 수 있습니다。fgets를 사용한 입력 예시:
#include <stdio.h>
int main() {
char str[100];
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin);
printf("입력된 문자열: %s", str);
return 0;
}
이 코드에서는,fgets
를 사용하여 문자열을 얻고, 이를 표시합니다.fgets
는 개행 문자까지 포함한 한 줄 입력을 읽어들이므로, 여러 줄에 걸친 데이터를 처리할 때도 유용합니다。getchar, scanf, fgets의 사용 구분
- getchar는 한 문자만 입력을 처리할 때 사용합니다. 예를 들어, 메뉴 선택이나 키 입력을 하나씩 처리하는 경우에 적합합니다。
- scanf는 여러 타입(숫자나 문자열)을 얻고 싶을 때 적합하지만, 오류 검사가 필요합니다。
- fgets는 긴 문자열이나 여러 줄에 걸친 데이터 입력이 필요할 때 편리합니다. 또한 버퍼 오버플로우를 방지하기 위해 읽어들일 문자 수를 제한할 수 있는 것이 장점입니다。
6. getchar를 사용한 실용 예: 대화형 프로그램
getchar
함수는 사용자 입력을 이용한 대화형 프로그램에서 자주 사용됩니다. 여기서는 특정 키 입력에 따라 처리하는 예를 소개합니다. 이러한 프로그램은 간단한 게임이나 메뉴 시스템을 구축할 때 유용합니다.샘플 코드: 문자 입력에 따른 메뉴 조작
#include <stdio.h>
int main() {
char choice;
printf("메뉴를 선택하십시오 (a: 안녕하세요, b: 종료): ");
choice = getchar();
switch (choice) {
case 'a':
printf("안녕하세요!n");
break;
case 'b':
printf("프로그램을 종료합니다.n");
break;
default:
printf("잘못된 선택입니다.n");
}
return 0;
}
이 프로그램에서는 사용자가 ‘a’ 또는 ‘b’를 입력함으로써 특정 메시지가 표시됩니다. getchar
을 사용하면 간단한 메뉴를 구현하고, 사용자의 입력에 따라 처리를 수행할 수 있습니다.응용 프로그램: 여러 명령에 대응
다음 코드는 사용자가 특정 문자를 입력하면 해당 입력에 따라 처리를 실행하는 예입니다.#include <stdio.h>
int main() {
char command;
printf("명령을 입력하십시오 (l: 리스트 표시, h: 인사, q: 종료): ");
command = getchar();
switch (command) {
case 'l':
printf("리스트를 표시합니다.n");
break;
case 'h':
printf("안녕하세요!n");
break;
case 'q':
printf("프로그램을 종료합니다.n");
break;
default:
printf("잘못된 명령입니다.n");
}
return 0;
}
이 프로그램에서는 사용자가 지정된 명령(l
, h
, q
)을 입력하면, 그에 대응하는 처리가 실행됩니다.7. getchar의 주의점과 베스트 프랙티스
자주 발생하는 문제점: 버퍼 처리
getchar
를 사용할 때 주의해야 할 점은 버퍼에 남은 데이터가 다음 입력에 영향을 줄 가능성이 있다는 것입니다. 예를 들어, getchar
를 한 번 호출한 후 버퍼에 남은 개행 문자가 다음 getchar
에서 읽혀버릴 수 있습니다. 이러한 상황을 방지하려면 버퍼를 비워야 합니다.개행 문자를 무시하는 방법:
#include <stdio.h>
int main() {
int c;
printf("문자를 입력하세요: ");
c = getchar();
while (getchar() != 'n'); // 개행 문자를 건너뛰기
printf("입력된 문자: %cn", c);
return 0;
}
이 코드에서는 getchar
를 사용해 한 문자를 입력한 후, 개행 문자가 버퍼에 남아 있기 때문에 이를 while
루프에서 무시하는 처리를 추가했습니다.베스트 프랙티스
- 버퍼 클리어: 입력 시 버퍼 내 개행 문자를 처리함으로써 다음 입력에 영향을 주지 않도록 합니다.
- 오류 처리:
getchar
의 반환값이EOF
인 경우 적절히 처리하도록 합니다. 특히 파일로부터 입력받을 때 중요합니다. - 입력 제한: 긴 문자열을 다루거나 특정 조건에 기반한 입력을 요구하는 경우
getchar
보다fgets
사용을 고려하세요.fgets
는 버퍼 크기를 지정할 수 있어 버퍼 오버플로를 방지합니다.
8. 요약 및 다음 단계
이 글에서는getchar
함수의 기본 사용법부터 응용 예제, 그리고 scanf
와 fgets
와의 비교를 통해 C 언어에서 입력 처리의 중요한 포인트를 설명했습니다. getchar
는 단순하면서도 다양한 상황에서 사용할 수 있는 강력한 도구입니다. 특히 대화형 프로그램이나 간단한 문자 입력 처리에 적합합니다.다음에 배워야 할 단계
- fgets와 scanf의 추가 활용: 문자열이나 숫자 입력 처리를 하고 싶다면,
fgets
와scanf
와 같은 다른 입력 함수의 사용법을 깊이 배우는 것이 효과적입니다. - 파일 입력 활용:
getchar
은 표준 입력뿐만 아니라 파일에서 데이터 읽기에도 사용할 수 있습니다. 파일 입출력 처리를 배우면 응용 범위가 더욱 넓어집니다. - 오류 처리 실천: 입력 시 오류 처리(특히
EOF
나 잘못된 입력에 대한 처리)를 정확히 수행함으로써 보다 견고한 프로그램을 만들 수 있습니다.