문제

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

설명

이문제는 string헤더에서 strlen으로 문자열 길이를 가져오는 것과 문자열을 입력받을때

공백까지 한줄씩 안전하게 불러오기 위해 scanf("%s",...); 를 안쓰고

gets(변수);를 썼다는 점 말고 크게 특별한 점은 없었고

문제에 티어만 봐도 문제가 없을 것으로 판단되었다.

그러나

문제는 백준을 포함한 온라인 저지에서 주로 요구하는 조건. EOF(End Of File)을 입력받아 프로그램을 종료하는 조건이었다.

scanf() 함수에 경우 문자열 입력에 실패, 즉 입력된 파일(문자열 복붙한거 같은거 포함)의 끝이 확인되면 함수 자체적으로 EOF를 리턴하게 되는데

gets는 모르고 있어서 이번에 찾아볼 수 있는 기회가 되었다.

gets는 scanf함수와 다르게 EOF가 아니라 NULL값(‘\0’)을 반환한다는 것을 확인하였다.

따라서 while(gets(변수)!=NULL){...}를 확용하면 파일의 끝이 감지될때까지 입력을 계속 이어나가도록 할 수 있었다.

참고 자료 : https://codedragon.tistory.com/2208 문제 : https://www.acmicpc.net/problem/10820

코드

#include <stdio.h>
#include <string.h>
int main() {
    char inp[100],n_cap=0,cap=0,num=0,blank=0;
    
    while(gets(inp) != NULL)
    {
        n_cap=cap=num=blank=0;
        for(int i=0; i<strlen(inp); i++)
        {
            n_cap += (inp[i]<='z'&&inp[i]>='a')?1:0;
            cap += (inp[i]<='Z'&&inp[i]>='A')?1:0;
            num += (inp[i]<='9'&&inp[i]>='0')?1:0;
            blank += (inp[i]==' ')?1:0;
        }
        printf("%d %d %d %d\n",n_cap,cap,num,blank);
    }
    return 0;
}