카테고리 없음

C stream과 C++ stream 의 차

hallojih 2021. 11. 4. 16:16

scanf/printf 에서는 신경을 안 써도 되는데 cin/cout 에서는 신경 써야할 부분이 있다.

scanf/printf 와는 다르게 cin/cout 은 입출력으로 인한 시간초과를 막기 위해서

 

ios::sync_with_stdio(0) 와 cin.tie(0) 라는 두 명령을 실행시켜야한다. 만약 이걸 하지 않으면 입출력의 양이 많을 때 시간초과가 날 수 있다.

 

ios::sync_with_stdio(0) 

C stream과 C++ stream은 분리가 되어있다.

그런데 두 가지를 동시에 써도 사용자 입장에서는 의도한 출력값이 제대로 나온다. 1)

 

출처_https://blog.encrypted.gg/923?category=773649

내가 C++ stream 만 쓸거면 굳이 두 stream을 동기화 할 필요가 없다. 왜냐하면 쓸데없이 시간만 잡아먹는다.

그렇기 때문에 C++ stream만 쓸거면 굳이 두 stream을 동기화 할 필요가 없다. 따라서 동기화를 끊어버려서 프로그램 수행시간에서 이득을 챙길 수 있고, 동기화를 끊는 명령어인 sync_with_stdio(0) 을 사용한다. (0이 아닌 false이나, 더 간단하므로 0을 대신 사용하고 있음)

그러나, 동기화를 끊었으면 절대 cout과 printf를 섞어서 쓰면 안된다.

만약 섞어 쓰게 되면 2)와 같이 출력 순서가 꼬이게 된다.

 

cin.tie(0)

버퍼의 개념 이해 필요

키보드로 문자를 입력 받아 console 화면에 출력하는 과정을 살펴보면,

문자를 입력하면 해당 문자가 출력 버퍼라는 곳에 임시로 저장되었다가 버퍼가 비워지면서 console 화면에 보이게 된다.

출력에도 버퍼가 있는 것처럼 입력에도 버퍼가 있어서 키보드로 받은 입력을 바로바로 넘겨주지 않고 버퍼에서 어느정도 모았다가 준다.

그런데 입력과 출력이 번갈아 나오고 그게 한 화면에 다 보여질 경우에는

 

출처_https://blog.encrypted.gg/923?category=773649

버퍼의 존재로 인해서 순서가 꼬일 수 있다.

위의 코드는 3번에 걸쳐서 두 수를 입력 받고 합을 출력하는데 순서에 맞게 console에 나타나지 않는다.

6번째 줄에서 118\n 이라는 출력을 하라고 했을 때 바로 출력이 되지 않고 버퍼에 들어갔다가 2,5를 입력한 후에야 출력이 되면 순서가 꼬이게 된다.

 

이러한 현상을 막기 위해, 기본적으로는 cin 명령을 수행하기 전에 cout 버퍼를 비워준다.

버퍼를 비워주면 자연스럽게 2,5 의 입력이 들어오기 전에  118이 출력된다.

 

그러나 온라인 저지 사이트에서는 채점을 할 때 그냥 출력 글자만 확인한다. 따라서 버퍼에 따라 순서가 꼬이는 문제를 신경 쓰지 않아도 된다.

그러면 굳이 cin 명령을 수행하기 전에 cout 버퍼를 비울 필요가 없다. 그래서 cin 명령을 수행하기 전에 cout 버퍼를 비우지 않도록 하는 코드가 cin.tie(nullptr)이고 엄밀하게는 type을 지켜서 nullptr로 쓰는게 좋지만 0으로 쓴다.

 

 

endl (쓰지말 것!)

개행문자("\n")를 출력하고 출력 버퍼를 비워라!는 명령어

온라인 저지 사이트에서는 프로그램이 종료될 때 출력이 어떻게 될지를 가지고 채점을 하게 되므로 중간 중간 버퍼를 비우라고 명령해줄 필요가 없다.

줄바꿈이 필요하다면 endl 말고 그냥 개행문자 출력할 것!

 

 

BOJ10871번

728x90
반응형