C 언어 getchar 함수 | 기본부터 응용까지 완전 해설

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의 차이

getcharscanf는 모두 입력을 받기 위한 함수이지만, 사용 방법과 적용 상황에는 큰 차이가 있습니다.scanf는 포맷 지정자를 사용하여 정수, 부동소수점, 문자열 등 다양한 데이터 타입을 입력할 수 있습니다. 반면,getchar는 표준 입력으로부터 한 문자를 얻는 간단한 함수입니다。

scanf를 사용한 입력 예시:

#include <stdio.h>

int main() {
    int num;
    printf("숫자를 입력하세요: ");
    scanf("%d", &num);
    printf("입력한 숫자: %dn", num);
    return 0;
}
이 코드에서는,scanf를 사용하여 정수 값을 입력하고, 이를 표시합니다. 이처럼,scanf는 여러 데이터 타입을 지원하며, 여러 값을 한 번에 얻을 수 있습니다。

getchar와 fgets의 차이

fgetsgetchar와 달리 여러 문자(문자열)를 한 번에 읽어들일 수 있습니다. 이는 표준 입력으로부터 문자열을 읽을 때 매우 편리합니다. 또한,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 루프에서 무시하는 처리를 추가했습니다.

베스트 프랙티스

  1. 버퍼 클리어: 입력 시 버퍼 내 개행 문자를 처리함으로써 다음 입력에 영향을 주지 않도록 합니다.
  2. 오류 처리: getchar의 반환값이 EOF인 경우 적절히 처리하도록 합니다. 특히 파일로부터 입력받을 때 중요합니다.
  3. 입력 제한: 긴 문자열을 다루거나 특정 조건에 기반한 입력을 요구하는 경우 getchar보다 fgets 사용을 고려하세요. fgets는 버퍼 크기를 지정할 수 있어 버퍼 오버플로를 방지합니다.

8. 요약 및 다음 단계

이 글에서는 getchar 함수의 기본 사용법부터 응용 예제, 그리고 scanffgets와의 비교를 통해 C 언어에서 입력 처리의 중요한 포인트를 설명했습니다. getchar는 단순하면서도 다양한 상황에서 사용할 수 있는 강력한 도구입니다. 특히 대화형 프로그램이나 간단한 문자 입력 처리에 적합합니다.

다음에 배워야 할 단계

  1. fgets와 scanf의 추가 활용: 문자열이나 숫자 입력 처리를 하고 싶다면, fgetsscanf와 같은 다른 입력 함수의 사용법을 깊이 배우는 것이 효과적입니다.
  2. 파일 입력 활용: getchar은 표준 입력뿐만 아니라 파일에서 데이터 읽기에도 사용할 수 있습니다. 파일 입출력 처리를 배우면 응용 범위가 더욱 넓어집니다.
  3. 오류 처리 실천: 입력 시 오류 처리(특히 EOF나 잘못된 입력에 대한 처리)를 정확히 수행함으로써 보다 견고한 프로그램을 만들 수 있습니다.
C 언어의 기본을 잡은 뒤 실용적인 프로그램을 만들기 위해서는 이러한 지식을 깊게 익히는 것이 중요합니다.
年収訴求