seecimi   4년 전

매 줄을 getline으로 받을때마다, 버퍼에 '\n'이 저장될거라 생각했습니다.

그래서 매 반복문이 끝날때마다, cin.ignore()를 사용했더니 출력초과로 오답을 받게되었습니다.

<궁금한 점>

모든 백준문제에서 예제 입력을 복사/붙여넣기 하여 문제를 풀었습니다.

이번문제는 cin.ignore()를 사용하지 않으면, 출력이

Found
Missing(개행문자 때문)
Found
Missing(개행문자 때문)
Missing
Missing(개행문자 때문)
Missing
Missing(개행문자 때문)
Found
Missing

이렇게 나오게 됩니다.

하지만 31번째 줄에 cin.ignore()추가시,

Found
Found
Missing
Missing
Found

정상적으로 출력됩니다.


제가 ignore()에 대해 잘못 알고 있는점이 있다면, 답변 부탁드리겠습니다.

읽어주셔서 감사합니다.

yclock   4년 전

http://www.cplusplus.com/reference/string/string/getline/

입출력 버퍼에 대하여 정확하게 알고 있지는 않습니다만, 찾아본 레퍼런스 내용에 기반하여 답변드리고자 합니다.

cin은 입력을 받을 경우, 개행 문자 전까지만 입력으로 생각하고, '\n'를 버퍼에 남기는 것이 맞습니다.

다만, getline은 개행 문자 전까지 입력을 받는 것은 동일하나, '\n'를 버퍼에 남기지 않습니다.


고로, 원칙적으로는 cin.ignore()를 사용하지 않는 것이 옳다고 봅니다.


BOJ의 채점결과와 로컬의 실행결과가 일치하지 않는 이유는 다양하겠습니다만, Windows와 Linux의 개행 문자 차이, 컴파일러의 차이 등이 그 이유가 되지 않을까 생각합니다.

seecimi   4년 전

1. cin으로 입력받을 경우, 버퍼에 '\n'이 남는다.

2. cin 다음 입력을 cin으로 받을경우, 전 버퍼에 있던 공백 및 개행문자를 무시하기 때문에 버퍼를 굳이 비워줄 필요가 없다.

3. cin 다음 입력을 getline으로 받을경우, 전 버퍼에 있던 공백 및 개행문자를 포함해서 입력받기 때문에 버퍼를 지워주는 작업이 필요하다.

4. getline 다음 입력을 getline으로 받을경우, getline은 '\n' 문자를 버퍼에 포함시키기 않기때문에 버퍼를 비워줄 필요가 없다.

5. BOJ의 채점결과와 로컬의 실행결과가 일치하지 않는 이유는 다양하겠습니다만, Windows와 Linux의 개행 문자 차이, 컴파일러의 차이 등이 그 이유가 되지 않을까 생각합니다.

구름Ide에서는 위의 코드에서 cin.ignore()를 포함시킬경우 정상적으로 작동하였으나, ideone에서는 런타임 에러가 발생(https://ideone.com/vKz64B)

특히 문자열 문제에서 오답시, 다른 컴파일러를 사용해 보는것도 좋은 선택.

////

나름대로 정리해봤습니다.

답변 감사합니다!!

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