-
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