https://www.acmicpc.net/problem/10951
10951번: A+B - 4
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
이 문제를 처음봤을 때 아무런 조건이 없길래 무한루프를 작성하라는 것인줄 알았지만
출.력.초.과
무엇이 문제인지 시간을 투자해도 내 지식의 범위로 풀 수 없다 판단하여 구글링 하였다..
우선 출력초과가 왜 나온지 궁금했다.
찾아보니 예를 들어 testcase 3개를 출력해야할 때 4개 이상이 출력된 경우 출력초과가 나온다고 했다.
그렇다면 어디까지 끊어줘야할까?가 궁금했다.
정답은 파일의 끝이었는데 파일에는 끝을 나타내는 문자나 값이 존재하지 않았다.
따라서 EOF(End Of File)이라는 상수가 파일의 끝을 표현하기 위해 존재했다. (-1값을 가진다.)
EOF는 파일 관련 함수가 기능을 다하지 못했을 때 반환하는 값인데
이 문제에서 scanf함수는 파일의 끝을 넘어 자료를 읽으려 시도하여 읽기에 실패하면 -1값을 반환하며 거기서 입력이 끝이난다.
#include <stdio.h>
int main(void) {
int a,b;
while(scanf("%d %d", &a, &b)!=EOF) {
printf("%d\n", a+b);
}
}
정답코드는 이랬다.그런데 scanf함수가 while문의 조건식에 해당했다. scanf는 입력을 받는 함수인데 조건으로 쓰인다는 것은 반환하는 값이 있다는 것인가?하는 의문이 생겼다.
헉 정말로 scanf함수는 반환하는 값이 있었는데 읽은 자료의 수를 반환했다.
위와 같이 정수형 자료를 읽어야하는데 문자형 자료(char형)로 잘못 입력한 경우 읽은 자료로 취급하지 않았다.
따라서 위 코드의 while문의 조건식은
scanf함수가 파일의 끝을 넘어 자료를 읽으려 시도하면 읽기에 실패하여 -1값을 반환하며 거기서 입력이 끝이나게끔 코드가 작성되어있었다.
왜 EOF는 상수 -1로 정의된 것일까 궁금했다.
0이라고 한다면 그것은 읽는 방식이 틀린 것이지 치명적인 오류가 아니었다.
그렇다면 음수라면 치명적인 오류를 나타내게 할 수 있었는데
음수에서 가장 표현하기 쉬운 -1(0xFFFFFFFF)이 가장 나은 것이 아닐까?하는 답변을 받았다.
정말로 그렇네?
'Baekjoon' 카테고리의 다른 글
[C] 백준 10809번 : 알파벳 찾기 (0) | 2023.01.15 |
---|---|
[C] 백준 11720번 : 숫자의 합 (0) | 2023.01.14 |
[C] 백준 9498번 : 시험 성적 (0) | 2023.01.11 |
[C] 백준 5597번 : 과제 안 내신 분..? (0) | 2023.01.11 |
[C] 백준 1008번 : A/B (0) | 2023.01.10 |