CODEDRAGON ㆍDevelopment/C, C++
입력버퍼가 비워지지 않은 경우(비정상 출력)
입력버퍼가 비워진 경우(정상 출력)
증상
입력버퍼에 데이터가 남아 있기 때문입니다.
scanf("%d", &a); 이전 구문에서 입력이 끝나면 입력버퍼에 \n(new line, 개형)이 남아 있습니다. 그래서 scanf("%c",&ch)구문의 ch에 기존에 있던 \n이 입력값으로 들어가고 다음 구문이 실행되어져 버렸습니다.
표준 입력시 사용자로부터 입력받는 즉시 처리되는 것이 아니라
입력버퍼를 거친 후(임시저장) 프로그램에서 입력버퍼에 있는 데이터를 가져가 사용하게 됩니다.
그래서 위와 같은 증상이 발생할 수 있으며 이를 해결하기 위해서는 입력버퍼를 비워주어야 합니다.
입력버퍼를 비우는 방법
· fflush(stdin);
· scanf("%*c");
· scanf(" %*c");
· getchar();
· rewind(stdin);
· while(getchar() != '\n');
%*c
그전에 입력된 것, 즉 입력버퍼에 있던 '\n'문자를 읽어와 버리는 역할을 합니다.
%*c%c
그전에 입력된 문자 하나를 읽어와 버리고 문자 하나를 입력받기
fflush(stdin); |
입력버퍼 비우기 |
scanf("%*c"); |
그전에 입력된 것, 즉 입력버퍼에 있던 '\n'문자를 읽어와 버리는 역할을 합니다. |
scanf(" %*c"); |
%c 앞에 공백을 추가하면 white space를 구분자로 인식 |
getchar(); |
문자 하나 버리기 |
rewind(stdin); |
ewind함수는 매개변수로 들어온 스트림을 초기화 |
while(getchar() != '\n'); |
|
'Development > C, C++' 카테고리의 다른 글
함수 형태 1 2 3 4 - 출력과 입력형태에 따른 분류 (0) | 2017.04.17 |
---|---|
함수 형태 - 출력과 입력형태에 따른 분류 (0) | 2017.04.17 |
Ex-중첩구조체 초기화 (0) | 2017.04.07 |
Ex-멤버변수로 구조체 변수를 사용하는 중첩구조체 (0) | 2017.03.31 |
Ex-구조체 변수간 산술연산 불가능 (0) | 2017.03.25 |