(https://www.acmicpc.net/problem/10951)
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
1 3
2 3
3 4
9 8
5 2
2
5
7
17
7
#include <stdio.h> int main() { int n1, n2; for (int i = 0; i < 5; i++) { scanf("%d %d", &n1, &n2); printf("%d", n1 + n2); } return 0; }
문제에 숫자를 몇 번 입력받는 지에 대한 정보가 없어 예제에 나온 수대로 5번 반복시켰다. 해당 제출이 틀림을 알고 백준에서 입력의 개수가 정해지지 않은 문제일 경우 EOF를 이용해 처리한다는 것을 뒤늦게 알게 되었다.
EOF는 학교 문제해결기법 강의 중 파일입출력 파트에서 사용했던 기억이 난다. (가물가물하다...) 그래서 이번 기회에 사용 예시와 함께 다시 정리해보려 한다.
EOF는 파일의 끝을 알리기 위한 상수이다. 데이터 입력이 없다면 -1을 리턴한다.
while(scanf("%d %d", &a, &b) != EOF) while (scanf("%d %d", &a, &b) != -1)
따라서 이 문제는 위 두 가지 방법과 같이 입력받은 정수가 EOF가 아닐 때까지 출력하도록 하면 된다.
EOF를 사용하지 않고 이 문제를 풀 수도 있다.
scanf 함수는 함수의 첫 인자의 포맷 형식의 개수를 리턴한다. (몇 개의 값을 받는지)
예를 들어
int a = scanf("%d %d %d", &a, &b, &c);
에서 a의 값은 3이다.
이 점을 이용한다면
while(scanf("%d %d", &a, &b) == 2)
이렇게 코드를 짤 수 있다. a와 b의 값이 2개가 정상적으로 들어올 때까지 값을 받는 코드인 것이다.
#include <stdio.h> int main() { int n1, n2; while (scanf("%d %d", &n1, &n2) != EOF) { printf("%d\n", n1 + n2); } return 0; }
#include <stdio.h> int main() { int n1, n2; while (scanf("%d %d", &n1, &n2) == 2) { printf("%d\n", n1 + n2); } return 0; }