알고리즘/백준(BOJ) 문제풀이

C++ getline EOF 조건문 없이 종료시키는 방법 (BOJ 10820)

restudy 2022. 3. 21. 04:36
반응형

이 포스트는 C++에서 getline으로 입력받을 때, EOF 조건문 (ex : while(cin.eof())) 없이 입력이 더 이상 주어지지 않을 때 프로그램을 종료 처리하는 방법에 대해 다루고 있습니다.

 

구체적인 예시를 들어 설명하기 위해 프로그래밍 문제 사이트 백준 Online Judge(BOJ)의 10820번 : '문자열 분석' 문제를 같이 풀이하도록 하겠습니다.

 

 

먼저 문제를 풀이하기 전에 결론부터 정리하자면, while(getline(cin, str))과 같이 getline문을 그냥 whlie문의 조건문 안에 넣어버리면, 입력이 종료되고 EOF 시그널이 전달됨과 동시에 getline 함수 자체가 false를 반환하므로 자동 종료가 됩니다.

 

따라서 while(cin.eof()) { string str; getline(cin, str); } 과 같은 코드로 처리할 필요가 없습니다.

 

 

10280번 : 문자열 분석

 

위와 같이 문자들이 정해진 개수 없이 그냥 입력되다가 알아서 입력이 끝나면, 대/소문자의 개수 및 숫자, 공백의 수를 출력하는 문제입니다.

각 문자 종류의 수는 조건문을 처리해주면 간단히 해결 가능하지만, 처음에 몇 개의 입력이 주어지는지를 입력하지 않기 때문에 eof(end of filie) 처리를 어떻게 해야할지 난감할 수 있습니다.

 

 

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(NULL);

    string str;

    while(getline(cin, str)) {

        int lower = 0, upper = 0, number = 0, blank = 0;
        for(int i=0; i<str.length(); i++) {
            if(str[i] >= 'a' && str[i] <= 'z') lower++;
            else if(str[i] >= 'A' && str[i] <= 'Z') upper++;
            else if(str[i] >= '0' && str[i] <= '9') number++;
            else if(str[i] == ' ') blank++;
        }

        cout << lower << " " << upper << " " << number << " " << blank << "\n";
    }
}

 

그런 경우 cin.eof()와 같은 함수를 사용하지 말고, 그냥 위와 같이 getline문 자체를 whlie문의 조건문에 대입하여 처리할 수 있도록 합니다.

위에서도 설명했지만, 입력이 종료되고 eof가 전달되면 알아서 getline에서 false를 반환하여 무한루프를 돌지 않고 while문이 종료되게 됩니다.

 

이를 테스트해보기 위해 콘솔 창에서 직접 ctrl + Z로 eof 신호를 전달하여 프로그램이 정상적으로 종료되는지 확인해보도록 하겠습니다.

 

 

 

위와 같이 ctrl + Z를 입력하면 콘솔에는 "^Z"와 같이 출력이 되는데, 엔터를 눌러 입력을 시켜보면 EOF가 정상적으로 전달되고 프로그램이 returned 0을 통해 제대로 종료됨을 확인할 수 있습니다.

 

 

 

 

 

반응형