ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2. 버퍼와 getchar()
    Programming Language/C 2020. 1. 31. 16:07

    지난 글에서 다룬 입출력 함수의 복습을 위해 간단한 예제를 풀어봅시다.

     

    다음 예시의 형식에 맞추어 정수 하나와 알파벳 하나를 순서대로 입력받고, 출력하여라.

    input : 10
    input : A
    number : 10
    character : A

     

    문제에서 정수 하나와 문자 하나를 입력 받기위한 공간이 필요하므로 `int`형 변수와 `char`형 변수를 하나씩 선언해야 할 것입니다. 그리고 문제에서 나온 순서대로 `scanf()`함수를 통해 입력받고, `printf()`함수를 통해 출력하면 될 것 같아보입니다. 그러면 코드를 작성해봅시다.

     

    #include <stdio.h>
    
    int main(void)
    {
        int number;
        char character;
        
        printf("input : ");
        scanf("%d", &number);
        
        printf("input : ");
        scanf("%c", &character);
        
        printf("number : %d\n", number);
        printf("character : %c\n", character);
        
        return 0;
    }
    input : 10
    input : number : 10
    character :

     

    음? 프로그램이 두번째 값을 입력할 기회를 주지않고 그대로 끝나버렸습니다. 이처럼 `scanf()`함수를 사용하여 문자형 자료를 받을 때는 주의를 기울여야합니다. 문제는 실제로 키보드를 통해 값을 입력하고 나서 엔터키를 칠 때, 이 엔터를 `\n`으로 받아들이는 것에서 발생합니다. 이전의 입력함수에서 값과 엔터를 입력하면 버퍼에 입력된 값과 `\n`이 들어가고, `scanf()`는 해당하는 자료형의 값만을 받아들이고 문자인 `\n`은 버퍼에 계속 남아있게 됩니다. 이 상태에서 `scanf()`로 문자형을 받아오게 한다면 `\n`이 입력되고 의도한 입력값이 변수에 저장되지 않게 됩니다.

     

    이 현상을 해결하기 위해서는 `scanf("%d", &number);`와 `scanf("%c", &character);`사이에서 버퍼를 비워주어야 합니다. 버퍼를 비우는 작업은 `getchar()`함수로 해결할 수 있습니다. `getchar()`함수는 `변수=getchar();`의 형태로 활용해 입력값을 변수에 저장한다. 이것을 입력값을 받기만 하고 아무 변수에도 저장하지 않는 형태로 만들면 `\n`을 비우는 효과를 낼 수 있기 때문에 `scanf("%c", &character);`이전에 `getchar();`을 추가하는 것만으로 버퍼 문제를 해결할 수 있습니다.

     

    #include <stdio.h>
    
    int main(void)
    {
        int number;
        char character;
        
        printf("input : ");
        scanf("%d", &number);
        getchar();
        
        printf("input : ");
        scanf("%c", &character);
        
        printf("number : %d\n", number);
        printf("character : %c\n", character);
        
        return 0;
    }
    input : 10
    input : A
    number : 10
    character : A

    'Programming Language > C' 카테고리의 다른 글

    5. 포인터  (0) 2020.01.31
    4. 배열과 문자열  (0) 2020.01.31
    3. if-else, for, while  (0) 2020.01.31
    1. 자료형과 표준 입출력 함수  (0) 2020.01.31
    0. Hello C!  (0) 2020.01.31

    댓글

Designed by Tistory.