scanf와 fgets 함수를 같이 사용하면서 나타나는 문제점
fgets 함수를 먼저 쓰든 scanf를 먼저 쓰든 두 함수가 연속적으로 온다면 둘중에 한 개의 함수만 실행되고 나머지 함수는 무시된다. fgets 함수나 scanf함수는 입력 버퍼에 Enter키가 입력될 때까지 입력을 받고, 출력은 \n(개행문자) 전까지의 데이터를 출력해준다. 따라서 입력 버퍼에는 아직 \n(개행문자)가 남아있으므로 두 번째 함수가 실행될 때는 자동으로 개행문자 데이터가 남아있으므로 함수가 입력이 끝난 줄 알고 종료한다.
따라서 이런 현상을 방지하려면!!!!!!!
윈도우: fflush(stdin)
리눅스, UNIX: fpurge(stdin)
을 사용해서 입력 버퍼에 있는 내용을 비워내야 한다. 그리고 fflush 함수는 입력 버퍼를 비우는 함수가 아니라 출력 버퍼를 비우는 함수이다. 하지만 MS 윈도우가 C 표준을 지키지 않은 덕분에 이렇게 사용도 가능하다.
호환성을 생각하는 코드를 작성해야 한다면, scanf("%d %*c", ~~~)로 작성을 해야 한다.
%*c는 문자 하나를 입력 버퍼에서 읽어온 후 그냥 버린다는 의미이다.
'언어 > C' 카테고리의 다른 글
비트필드 구조체 (0) | 2016.10.27 |
---|---|
volatile 형한정어 (0) | 2016.10.19 |
배열의 문자열 초기값과 포인터의 문자열 초기값의 차이 (0) | 2016.10.13 |
getc() 함수를 사용했을 때의 오류 (0) | 2016.09.28 |
함수 포인터 컴파일 오류 (0) | 2016.09.26 |