카테고리 없음
[c언어] scanf 다시 사용할 때 공백 넣어야 하는 이유
hatch
2023. 9. 11. 16:26
728x90
반응형
문제
오랜만에 c언어 복습하다 문제상황에 부딪혔다.
scanf를 다시 쓰려고 하니 입력을 안 받고 그냥 넘어가는 것이다.
여기 간단한 사칙연산 예제를 보자
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main() {
int a, c;
char b;
printf("첫째 계산 값: ");
scanf("%d", &a);
printf("연산자 입력(+, -, *, /): ");
scanf("%c", &b);
printf("둘째 계산 값: ");
scanf("%d", &c);
int result;
if (c > 0) {
switch (b) {
case '+':
result = a + c;
printf("%d", result); break;
case '-':
result = a - c;
printf("%d", result); break;
case '*':
result = a * c;
printf("%d", result); break;
case '/':
result = a / c;
printf("%d", result); break;
}
}
else printf("0으로 나눌 수 없습니다. 자연수를 입력하세요.");
}
이렇게 하면 정상적으로 돌아갈까?
아니다. 연산자 입력값을 skip 하게 된다.
당연히 이후 과정을 진행해도 결과가 정상적으로 출력되지는 않는다.
그럼 어떻게 해야 할까?
해결
scanf를 다시 사용하는 입력문에 공백을 넣어줘야 한다.
이 예제에서는 %c 앞에 공백을 넣어주면 된다.
printf("연산자 입력(+, -, *, /): ");
scanf(" %c", &b);
그럼 그 이유는 무엇일까??
Scanf() 함수의 버퍼 데이터를 비워야 하기 때문이다.
키보드를 통해 화면에 보여지기까지의 과정에서 <입력 버퍼>를 거치게 된다.
따라서 앞에서 scanf를 사용했다면, 다시 사용할 때 이미 scanf 버퍼가 차있는 것이다.
버퍼 비우는 법은 다음과 같다.
1. " %c" 와 같이 공백을 앞에 두면 white space로 인식해 버퍼가 비워지게 된다.
- scanf는 공백을 기준으로 입력받는다.
- 버퍼를 비우려면 → 공백을 넣어주면 된다!
2. getchar()를 이용해 개행문자를 제거한다.