[Baekjoon/백준][10951][C/C++] A+B - 4 (EOF)
『목차』
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;
}