728x90
728x170
*scanf() 입력 버퍼 비우는 방법
scanf()를 사용하다 보면, 입력을 정상적으로 받지 못할 경우가 생기게 된다.
이러한 종류의 문제는 입력 버퍼(stdin Buffer)와 관련된 문제가 대부분이며, 이 문제를 해결하기 위해서는 입력 버퍼를 비워줘야 한다.
입력 버퍼를 비우는 방법을 이 글에 총정리 해보았다.
#pragma warning(disable: 4996) #include <cstdio> int main() { char ch; scanf("%c", &ch); printf("1, %c\n", ch); scanf("%c", &ch); printf("2, %c\n", ch); return 0; }
a
1, a
2,
ab
1, a
2, b
- 무슨 일이 일어났는지 확인해 보기 위하여 다음과 같이 코드를 수정해서 프로그램을 실행
#pragma warning(disable: 4996) #include <cstdio> int main() { char ch; scanf("%c", &ch); printf("1, %c\n", ch); scanf("%c", &ch); printf("2, %d\n", ch); // %c -> %d로 형식 지정자 변경 return 0; }
a
1, a
2, 10
- 정수
10
을 아스키 코드표에서 찾아보면\n
임을 알 수 있음.- 엔터(Enter) 값이 버퍼에 들어가게 됨.
- 이러한 문제를 해결하기 위해 다음과 같은 방법을 사용함.
①
fflush(stdin)
사용- 표준으로 정의되어 있지 않음.
- 플랫폼 마다 동작이 다를 수 있음.
- 가급적 이 방법을 사용하지 않는 것이 좋음.
#pragma warning(disable: 4996) #include <cstdio> int main() { char ch; scanf("%c", &ch); printf("1, %c\n", ch); fflush(stdin); // 입력 버퍼의 내용을 비움. scanf("%c", &ch); printf("2, %c\n", ch); return 0; }
a 1, a 2,
②
getchar()
사용#pragma warning(disable: 4996) #include <cstdio> int main() { char ch; scanf("%c", &ch); printf("1, %c\n", ch); getchar(); // 입력 버퍼의 내용을 비움. 엔터(Enter)의 아스키 코드 값 10이 삭제됨. scanf("%c", &ch); printf("2, %c\n", ch); return 0; }
a 1, a 10 b 2, b
- 하지만 다음과 같이 입력하면 제대로 작동하지 않음.
getchar()
는b
를 가져와b
는 삭제되고, 엔터의 아스키 코드(10
)가 다음에 입력됨.
ab 1, a 2,
- 이 문제는 반복문 을 사용하여 해결할 수 있음.
#pragma warning(disable: 4996) #include <cstdio> int main() { char ch; scanf("%c", &ch); printf("1, %c\n", ch); while (getchar() != '\n'); // 개행 문자를 만나게 되면 반복 종료 scanf("%c", &ch); printf("2, %c\n", ch); return 0; }
ab 1, 1 b 2, b
- 하지만 다음과 같이 입력하면 제대로 작동하지 않음.
728x90
그리드형(광고전용)
'Programming > C++' 카테고리의 다른 글
main(int argc, char* argv[]) (0) | 2021.01.29 |
---|---|
비교/관계 연산자 오버로딩 예 (0) | 2021.01.12 |
프로그램 실행 시간 측정 방법 (clock()) (0) | 2020.12.28 |
단축 평가 논리 계산법(Short-Circuit Evaluation) (0) | 2020.12.26 |
Dynamic Memory (동적 메모리) (0) | 2019.05.06 |
Pointers (포인터) (0) | 2019.05.06 |
Naming Rules for Variables (변수 이름 생성 규칙) (0) | 2019.05.06 |
sort 함수 정렬 기준 (0) | 2018.11.17 |