강의 정리/씨언어 백준

(오답노트) 백준(BOJ) 10951 번, while과 EOF - C언어

PurpleGuy101 2021. 12. 16. 17:02

 

A+B - 4 

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 256 MB 186047 64953 55228 35.446%

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력

각 테스트 케이스마다 A+B를 출력한다.

예제 입력 1 복사

1 1
2 3
3 4
9 8
5 2

예제 출력 1 복사

2
5
7
17
7

출처

 

//////////////////////////////////////////////////////

 

EOF가 뭐시여?

End of File 이라고 해서 입출력할때 끝을 표시하는 마커라나

지금처럼 입출력을 아예 안하면서 함수를 끝내는 경우나 

나중에 스트링 입출력할때도 요긴하게 쓰인다.

 

////////////////////////////////////////////////////

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

int main() {

    int a=1, b=1;
    while (1) {
        scanf("%d %d", &a, &b);
        if (a == EOF && b == EOF)
            break;
        printf("%d\n", a + b);
    }
    return 0; 
}

 

// 이렇게 짜면 안된다.

이런식으로 EOF가 a,b에 배정될까? 해서 시도해봤지만 에러난다.

애초에 scanf단계에서 변수의 포인터에 값을 할당 받지도 못했다.

 

/////////////////////////////

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

int main() {

    int a, b;

    while (scanf("%d %d", &a, &b) != EOF); {
        printf("%d\n", a + b);
    }
  
    return 0; 
}

///////////////////////////////////

 

이렇게 된다면 scanf에서 2개의 값을 입력받은 경우에는 scanf가 반환하는 값이 2가 되어 EOF(-1)이 아니므로 계속 진행

이외에 에러값이나 문장의 끝을 읽으면 scanf가 반환하는 값이 -1이 된다나

VS에서 코드 실행한 후 키보드로 아무것도 안치고 엔터누르면 끝날줄 알았는데  안끝나지더라

근데 백준에서는 맞은걸로 처리됨 뭐냐 이거

 

//////////////////////////////////

 

(220225) 첨가해설

설명을 하자면 scanf라는 함수는 반환값이 존재하기 때문에

기본적인 역할은 공백문자' '나 줄바꿈문자'\n'를 기준으로 숫자나 문자를 포인터에 저장하는 함수이지만

int a,b;

int return = scanf("%d %d",&a,&b); 이런식으로 함수가 반환하는 리턴값을 받아낼 수도 있다.

 

a,b에 둘다 성공적으로 scanf로 정보가 들어갔으면 2를,

하나만 들어갔다면 1을, 둘다 들어가지 않았다면 EOF를 반환하도록 하는 구조이다.

프로그래밍 언어마다 EOF는 다르고, c의 경우는 -1이 EOF이다.

여튼 

 

while (scanf("%d %d", &a, &b) != EOF); {
        printf("%d\n", a + b);
    }

 

while (scanf("%d %d", &a, &b) != -1); {
        printf("%d\n", a + b);
    }

 

이렇게 쓰는것은 c에서는 같은 코드라고 봐도 무방하고

 

3. while (~scanf("%d"&n))

 

https://donggod.tistory.com/55

요기서는 EOF가 -1이니 비트연산으로 ~EOF = ~(1111....1111)=0000....0000

이되는 것을 이용하는 법도 소개하고 있다.