프로그래밍2009. 4. 23. 23:22
반응형
리눅스에서 fflush() 안 될때 해결책
오늘 책 보다가.....간단한 문제로 30분넘게 고민했었다.
fflush()함수가 바로 그 원인....
 
기존에 window에서 programming할때는..fflush()함수를 사용하면...
입력버퍼에 쌓여있던...쓰레기값들을 모두 확실히 날려 버렸지만..
linux상에서는 조금 다른것 같다. 함수 자체가 다르다기 보다는 키보드 입력버퍼가 다른것 같다.
 
일단...fflush()에 대해 간단히 설명하겠다.
 
어떠한 문자를 입력받을때, (scanf()혹은 getchar()를 사용할때...)
특정값을 입력하고, 입력을 완료하기 위해서는 엔터를 치게 된다.
만약 k라는 문자를 입력하고 엔터를 치게 된다면...
입력버퍼에는 k와 엔터(\n, 개행문자)가 모두 버퍼로 들어가버린다.
컴퓨터는 사람과는 달리 엔터를 개행문자로써 하나의 입력으로 생각하기때문이다.
잠시후 다시 p라는 입력값을 받았다고 하자.
처음에 버퍼에는
k \n이라는 값이 저장되어 있을것이고...k를 사용했다면...버퍼에는 \n만이 남아 있다.
여기에 을 입력 받으니..
\n p \n 이 버퍼에 남아 있게 될것이다.
당연...입력을 요했던 곳에서는 첫번째 값만을 사용하고...
p가 사용되어야 할 곳에 \n이 사용되니...예상치 못한 결과를 출력할 수 있겠다.
 
 
이 문제를 해결하기 위해서...
fflush()함수를 아래와 같이 사용한다.

while(c != EOF){
    printf(" input a or others:");
    c = getchar(); fflush(stdin);
    if(c == 'a') puts("it's a");
    else puts("it's not a");
}
 
하지만.......오늘 완전 놀라고 또 놀란것은...
위와같은 경우  window에서는 fflush(stdin);이라는 코드를 잘 인식해, 키보드 버퍼를 비우게 되지만, linux에서는 꼭 그렇지는 않다는 것을 알게 되었다.
 
linux에서는 무작정...버퍼를 비우기 위해 fflush()를 사용하기보다는...
예전에 사용했던것처럼..
c = getchar(); getchar();
를 사용하거나....
while(getchar() != '\n') ;
를 사용해서 리눅스 상의키보드 버퍼의 내용을 싹 비우는것이 더 정확한것 같다.
 
ps. 어떤 문서에 보니깐..fflush()함수를 사용하지 말라고 적어 있는것도 있더라....

 


반응형

'프로그래밍' 카테고리의 다른 글

[C++] 디폴트 매개변수, default parameter  (0) 2019.08.14
bind error 방지  (0) 2010.07.17
쓰레드 동기화 함수  (0) 2008.04.28
기본 Thread 함수  (0) 2008.04.28
fork와 thread의 차이점  (0) 2008.04.28
Posted by pmj0403