본문 바로가기

진리는어디에

[C/C++] scanf시 엔터 무시 하기

C/C++에서 표준 입력을 받아야 하는 경우 엔터가 입력으로 받아져, 정작 받아야 할 입력을 건너 뛰는 경우가 있습니다. 다음 예를 살펴 볼까요 :

char ch1, ch2;

printf("첫번째 문자를 입력하시오");
scanf("%c", &ch1);

printf("두번째 문자를 입력하시오"); 
scanf("%c", &ch2); 

위와 같이 코딩을 한다면 첫번째 문자를 입력하고 엔터를 치게 되면, 입력 버퍼에 엔터 문자가 남아있게 되어 두번째 입력에서 엔터를 자동적으로 입력을 받아 버리기에 정상적인 입출력이 이루어지지 않습니다.

위 문제를 해결하기 위해 fflush(FILE* fp) 함수와 잘 알려지지 않은 방법으로 "%*c" 포멧을 사용할 수 있습니다.

fflush는 입력 버퍼 버퍼를 비워버리고, %*c는 문자 입력을 무조건 무시하라는 뜻이다.

위의 사항을 가지고 다시 코드를 작성 해보겠습니다.

fflush

printf("첫번째 문자를 입력하시오");
scanf("%c", &ch1); 

fflush(stdin); //입력 값이 파일 포인터이므로 stdin을 써주면 된다.
               //버퍼에 들어 있는 내용을 다 비워 버리므로 다음에 읽어 올것이 없다.  

printf("두번째 문자를 입력하시오");
scanf("%c", &ch2); 

"%*c"

printf("첫번째 문자를 입력하시오");
scanf("%c%*c", &ch1); // "%*c"는 입력 되는 문자 하나를 무시하라는 뜻이다.
                      // 여기서는 엔터를 무시한다.
printf("두번째 문자를 입력하시오");
scanf("%c", &ch2); 
유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!