sharpnpen   7년 전

예를 들어, 첫번째 줄에서  5개 수를 입력 받겠다고 한다면,

두번째 줄부터 차례대로 5개의 수를 각각 입력 받아야 되는데,

항상 그거보다 하나 더 많은 수를 입력 받습니다. 즉, 6개의 수를 입력 받는게 골치입니다.

혹시 아시는 분 가르쳐주시면 감사하겠습니다.^^

bupjae   7년 전

scanf 의 동작 방식 때문입니다. 실제 채점 시스템에서는 영향을 주지 않을 겁니다.

scanf 의 format string 에서 공백의 의미는 "다음 글자가 whitespace 가 아니거나 오류가 발생할 때 까지 입력을 읽은 후 버린다" 입니다.

즉, 5개의 정수를 다 입력받은 후에 whitespace가 아닌 글자를 찾을 까지 계속 입력받으려 하기 때문에 마치 6개의 정수를 요구하는 것 처럼 보입니다.

하지만 이 "6번째 정수"는 입력 처리가 되지 않은 채 프로그램이 끝나게 됩니다.

채점 시스템에서는 5번째 정수를 입력받은 뒤 "파일의 끝"에 도달하기 때문에, scanf는 이를 입력 오류로 생각하고 whitespace 찾기를 그만둡니다.

sharpnpen   7년 전

댓글 잘 읽어보았습니다. 그런 점이 있는 줄은 전혀 몰랐습니다. 새로운 사실을 알게 되어 기쁘고 감사합니다.^^

위에 올린 코드 그대로 제출하니까, 정답처리가 되었습니다. 님 말씀처럼 입력오류로 생각하고 시스템이 인식하고 넘어갔나 봅니다.

근데, 혹시 그럼에도 불구하고, scanf의 이런 문제점을 보완해서 코드를 좀 수정해서 짤 수 있는 방법은 없는 건가요?? 

bupjae   7년 전

저는 보통 scanf(" %d", ...) 를 사용합니다. whitespace를 정수를 읽기 전에 소모하고, 정수를 읽은 뒤에는 더 찾으려 하지 않기 때문에 괜한 오해(?)가 생길 일은 없을 겁니다.

sharpnpen   7년 전

아하, 그게 결국은 \n을 써서 문제가 생기게 된 거네요. 감사합니다!^^

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