본문 바로가기

C/개념

scanf의 맹점 / 입력 버퍼

반응형
SMALL

C언어로 문제를 풀다가 아래와 같은 입력 값을 받았습니다.

1
3
A 10
B 7
C 5

그래서 저는 A와 10을 따로 변수에 담기 위해서 아래와 같은 코드를 이용했습니다.

#include <stdio.h>

int main(void) {
    int num;
    char word;
    int T;
    int N;
    
    scanf("%d", &T);
    for (int t = 1; t <= T; t++) {
    	scanf("%d", &N);
        for (int n = 0; n < N; n++) {
        	scanf("%c %d", &word, &num);
        }
    }
}

그런데 저 num과 word의 값을 출력해보니 전혀 의도치 않은 값들이 나왔습니다.

왜 그럴까요??


입력버퍼

위의 문제를 해결하기 위해선 입력버퍼를 알아야합니다. 위의 코드를 실행하여 데이터를 넣으려고 하면 N을 받는 scanf에서 정수를 받고 엔터를 누르는 바람에 \n에 대한 버퍼가 남아 있게 됩니다. 그 후 두 번째 scanf가 실행되면서 \n을 받고 그냥 넘어가게됩니다.

 

해결방법은 뭘까요?

  • getchar()를 사용하면됩니다.
    • 개행문자 \n이 문제였다면 단어 하나를 받는 getchar()를 이용하여 \n을 받아버리면 됩니다. 그럼 버퍼가 비워지고 새롭게 scanf를 받을 수 있습니다.
#include <stdio.h>

int main(void) {
    int num;
    char word;
    int T;
    int N;
    
    scanf("%d", &T);
    for (int t = 1; t <= T; t++) {
    	scanf("%d", &N);
        getchar();
        for (int n = 0; n < N; n++) {
        	scanf("%c %d", &word, &num);
            getchar();
        }
    }
}

그런데 저희는 정수형 데이터를 받을 때 getchar()를 일반적으로 사용하지 않습니다. 왜냐면 정수형 데이터를 받을 땐 \n이 버퍼에 있으면 무시하게됩니다. \n은 정수가 아니잖아요 ^_^


이상 scanf의 맹점 (입력 버퍼) 였습니다. ^_^

반응형
LIST