본문 바로가기

Algorithm/Etc

endl과 \n, flsuh

풀이법은 맞는데 계속 시간 초과가 나서 뭔가 했는데

endl이 문제였다.

 

endl은 flush를 겸하기 때문에 매우 매우 매우 매우 매우 느립니다. '\n'을 대신 사용하세요.

 

 

항상 flush를 해서 느린 c++ endl

 

 

1 버퍼의 내용을 모두 지운다.
2 버퍼의 내용을 모두 처리한다.
(여기서 처리한다는 그냥 버리는게 아니다)

 

 

 stream에서 어딘가로 written을 한다. 그리고 내부적으로는 버퍼로 구현된. 이라는 게 눈에 들어옵니다.

 

 

 endl을 만난 경우에, '\n'을 추가하고, flush를 하는데요.

 

 

 버퍼링 정책이 버퍼가 꽉 찼을 때 출력하는 정책이라 해도, endl을 넣으면 강제로 flush가 됩니다. 이게 얼마나 큰 차이냐. 라고 다시 되물으신다면, 위에서 strace 한 결과를 보여드렸으니, 생략해도 될 듯 싶습니다. 요약하면, 개행을 출력하기 위해서 endl을 쓰기 보다는 '\n'을 쓴다. 정도로만 보시면 되겠습니다.

 

 

 

항상 flush를 해서 느린 c++ endl

 처음 백준을 하시다 보면, 출력하실 때, 개행을 출력하기 위해서 endl을 많이 쓰는 실수를 합니다. 이게 어떤 문제가 있는지 공식 문서를 하나 하나 해석해 보면서 알아보겠습니다.  먼저 링크

codingdog.tistory.com

 

 


실행 결과는?

문자열만 입력받아버리고 프로그램이 끝나버린다.

원인은
scanf("%s", string);
가 실행되고 나서 입력버퍼에는 개행문자가 그대로 남아있는 거다.

그래서
scanf("%c", &c);
를 실행하려고 보니 버퍼에 개행문자가 있어서 그걸 c에다 넣어버린거다.
정작 표준입력으로는 아무것도 입력안했는데
예전에 이걸 몰라서 개고생한거 생각하면..

해결방법은
입력버퍼를 비우면 된다.

어떻게?
        scanf("%s", string);

       scanf("%c", &c);
이 두 사이에 입력버퍼를 비워주는 뭔가를 해주면 된다.

1. 간단하게는 getchar(); 를 추가하는 걸로도 가능

2. fflush(stdin); 추가
그런데 이건 gcc에서 안돌아간다. 왜? 당연히 안된다. 표준 fflush함수는 출력버퍼를 비우는 녀석이다.
VC에서는 확장해서 사용하므로 동작하지만 gcc는 안된다.

 

c언어에서 입력버퍼 비우기

c언어에서 가끔 발생하는 문제가 scanf로 입력받다가 입력버퍼가 다 비워지지 않아서 문자입력받는게 씹히는 경우가 생긴다. c언어 공부하다보면 꼭 한번쯤은 겪어보는 문제 예를 들면 #include int

plustag.tistory.com

 

'Algorithm > Etc' 카테고리의 다른 글

다익스트라(Dijkstra) 알고리즘  (0) 2021.07.16
순열 알고리즘 (Permutation Algorithm)  (0) 2021.07.01
지도에서 DFS, BFS  (0) 2021.06.09
Deque  (0) 2021.05.21
DP 하면서 틀리는 것 / DFS하면서 틀리는 것  (0) 2021.05.11