반응형
DoZZang
Do IT
DoZZang
전체 방문자
오늘
어제
  • Programming
    • Git
    • Web
    • 기타
    • Python
      • CodeUp
    • Math
    • Algorithm
    • Baekjoon
    • C,C++
    • Life
      • 독서
      • Just
      • 영화

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
DoZZang

Do IT

[C] 백준 10951번 : A + B - 4
Baekjoon

[C] 백준 10951번 : A + B - 4

2023. 1. 13. 15:09
반응형

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
    'Baekjoon' 카테고리의 다른 글
    • [C] 백준 10809번 : 알파벳 찾기
    • [C] 백준 11720번 : 숫자의 합
    • [C] 백준 9498번 : 시험 성적
    • [C] 백준 5597번 : 과제 안 내신 분..?
    DoZZang
    DoZZang
    과정은 힘들지만 성장은 즐겁습니다.

    티스토리툴바