lucete171   3년 전

1. 11번째 줄에서 fflush(stdin)만 썼을 때 프로그램 돌렸을 떄는 원하는 대로 돌아가는 이유가 뭔가요 ?

원래대로 라면 getchar()로 버퍼에서 불러오고 fflush(stdin)써서 지워줘야 한다고 알고는 있는데도 어렵네요..

2. " fflush함수는 함수의 인자에 해당하는 출력 버퍼를 비우는 역할이다" 라는 말을 찾았는데 이게 무슨 말인지도 잘 모르겠구요

3. 결과적으로 입력받은 enter를 없애주고 프로그램을 원하는 대로 돌아가게 하려면

getchar()만 하거나 getchar() + fflush(stdin)을 해줘야하던데 이렇게 되니까 getchar() 만 썼을 때 맞는 이유도 잘 모르겠습니다

getchar()를 해도 버퍼에 enter는 남아 있는거 아닌가요....많이 헷갈립니다

bupjae   3년 전

fflush 의 원래 역할은 출력 스트림이 잠시 보관하고 있던 버퍼의 내용을 강제로 출력 장치에 내보내고 출력 버퍼를 비우는 것입니다.

iostream 에서, endl 은 '\n'을 출력함과 동시에 flush 연산을 합니다.

입력 스트림에 대한 fflush 의 동작은 구현체마다 다릅니다. Visual C++ 에서는 stdin 이 키보드와 연결되어 있다면 입력 버퍼를 비우는 것으로 구현되어 있지만,

다른 구현체에서는 전혀 다른 동작을 할 수 있습니다.

게다가, Visual C++ 이라고 할지라도 stdin 이 키보드가 아니라면 예상했던 것과 전혀 다른 동작을 할 수 있습니다.

   

cin >> n; 으로 정수를 입력받으면 정수 바로 직후에 나오는 \n 은 스트림에 남아있습니다.

이 때 getchar() 를 사용하면, 스트림에 있는 글자 하나 \n을 읽어오게 됩니다.

   

결론을 이야기하자면

입력 스트림에 남아있는 \n 을 지우기 위해서는 공백 문자 여부와 관계없이 한 글자를 읽는 함수를 써야 하며, fflush 는 사용하지 않아야 합니다.

getchar() 가 정확히 이 역할을 하며, iostream 을 사용할 경우 cin.ignore 메소드를 활용할 수도 있습니다.

lucete171   3년 전

배우고 있는 강의에서는 visual stdio를 사용하고 있고 제가 원래 기존에 사용하던 건 dev c++이라 계속 헷갈리네요 감사합니다

댓글을 작성하려면 로그인해야 합니다.