⌨️CS-PS/백준_수학&구현

[Baekjoon/백준][10951][C/C++] A+B - 4 (EOF)

미르의 블로그 2023. 1. 24. 10:10
728x90
반응형
『목차』
0. 개요

1. 문제
2. 풀이
3. 코드

0. 개요

C에서 EOF, scanf(), feof()의 개념에 대해 알고 있으면 풀 수 있는 문제.

1. 문제

https://www.acmicpc.net/problem/10951

 

10951번: A+B - 4

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

www.acmicpc.net

[문제]

두 정수 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

2. 풀이

이 문제의 핵심은 몇 개의 테스트 케이스를 입력 받을지 알 수 없다는 점이다. 파일의 끝에 도달하여 더 이상 읽을 데이터가 없을 때, 입력 스트림은 EOF(End Of File)를 리턴한다. EOF는 End Of File의 약자로, 파일의 끝을 표현하기 위해 -1로 정의된 상수이다. (이는 헤더파일 <stdio.h>의 41행에 정의되어 있다.) 결국, 이 문제는 EOF가 될 때까지 반복해서 입력을 받으면 되는 문제이다.

while (scanf("%d %d", &a, &b) != EOF)
while (scanf("%d %d", &a, &b) == 2)

/* line 1과 line 2중 하나를 선택하여 문제를 풀면 된다. */

이 문제의 핵심이 되는 코드는 위와 같다. 이는 파일의 끝(EOF)에 도달할 때 까지 while문을 실행한다는 의미를 지닌다.

 

scanf 함수는 '읽어들인 입력의 개수를 반환'한다. (이를 알면, scanf로 입력값을 읽어들일 때 "C6031 반환값이 무시되었습니다." 라는 경고가 뜨는 이유도 알 수 있다.) '읽어들인 입력의 개수를 반환'한다는 것은 scanf함수 호출 시 사용한 형식 지정자(%로 시작하는 형식) 중 몇 개가 처리되었는지를 반환한다는 의미이다. 즉, 파일의 끝(EOF)에 도달하면 -1(=EOF)을 반환한다.

 

예를 들어 아래와 같은 코드를 실행한다고 가정하자.

int main() {
    int a, b;
    int n = scanf('%d %d', &a, &b);
    printf("%d", n);
    return 0;
}

1 1 입력 시 2가 출력된다.
1과 1을 공백을 두고 입력하면 지정된 형식인 정수값 2개가 정상적으로 입력되었기 때문에 scanf() 함수는 2를 출력함으로써 %d 2개가 처리되었음을 알려준다.

 

a 1 입력 시 출력은 어떻게 될까?
두번째 %d는 정상적으로 입력되어 1이 출력될 거라 생각할 수 있지만 0이 반환된다. 그 이유는 scanf() 함수는 잘못된 입력값을 만나면 입력을 실패로 처리하고 함수를 종료하기 때문이다. 따라서 첫번째 %d에서 오류가 난 문자 'a'는 표준 입력 버퍼에 남고 두번째 %d를 처리하기 전 scanf함수가 종료된다.

 

1 z 입력 시 출력은 어떻게 될까?
1이 출력된다.

3. 코드

[풀이1. scanf()의 반환값을 이용한 풀이]

#pragma warning (disable:4996)
#include <stdio.h>

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

[풀이2. feof()를 이용한 풀이]

#pragma warning (disable:4996)
#include <stdio.h>

int main(int argc, char* argv[]) {
	int a, b;
	while (true) {
		scanf("%d %d", &a, &b);
		if (feof(stdin) != 0)
			break;
		printf("%d\n", a + b);
	}
	return 0;
}
728x90
반응형