BOJ - [String - 10820 문자열 분석] - BRONZE II 🥉
https://www.acmicpc.net/problem/10820 이문제는 string헤더에서 strlen으로 문자열 길이를 가져오는 것과 문자열을 입력받을때 공백까지 한줄씩 안전하게 불러오기 위해 scanf(%s,...); 를 안쓰고
1분 읽기
문제
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;
}