반응형
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
'C > 개념' 카테고리의 다른 글
C에서 문자열 반환하는 함수 만들기 (1) | 2020.01.29 |
---|---|
scanf의 맹점 (2) / 입출력 속도 (0) | 2019.12.12 |
"const char *" 형식의 값을 사용하여 "char *" 형식의 엔터티를 초기화할 수 없습니다. - 에러 수정 (5) | 2019.12.02 |
Hash 구현 (0) | 2019.08.18 |
Hash 알고리즘 (0) | 2019.08.10 |