백준
백준 1152번 단어의 개수 - C언어
해보쟈
2024. 2. 6. 13:50
#include <stdio.h>
#include <string.h>
int main() {
char str[10000000];
int cnt = 0, len, i = 0;
//공백 포함하여 문자열 입력받기
scanf("%[^\n]s", str);
len = strlen(str);
//공백만 입력되었을때
if (len == 1) {
if (str[i] == ' ') {
printf("0\n");
return 0;
}
}
//단어 개수 세기
for (int i = 1; i < len - 1; i++) {
if (str[i] == ' ') {
cnt++;
}
}
printf("%d", cnt + 1);
return 0;
}
주의할 점
1. scanf("%[^\0]s",str);
2. 공백만 입력되었을 경우 생각하기
3. 배열 크기 크게 잡기 -> 런타임에러의 원인
먼저 scanf로 문자열을 그냥 입력받으면 공백에서 멈추게된다. (hi hello를 입력해도 hi만 입력받음)
그래서 %[^\0]s 이렇게 포맷하여 공백을 포함하여 문자열을 입력받는다. (gets(str)해도 상관 없음)
더보기
%[...] : 대괄호 안에 있는 문자만 입력 받음
%[^...] : 대괄호 안에 있는 문자만 빼고 입력 받음
ex)
scanf("%[a-zA-Z]",str);
scanf("%[^0-9]",arr);
str에는 영어만 입력받고 저장됨. 만약 다른 문자가 온다면 입력 멈춤.
=> fd13as 입력하면 fd까지만 입력되어 저장됨.
arr에는 숫자 제외하고 입력 받음. 만약 숫자가 들어오면 입력 멈춤.
=> fd!!13as 입력하면 fd!!까지만 입력되어 저장됨.
그러니 scanf("%[^\0]s",str); 를 하면 \0(널 문자) 제외하고 쭉 입력을 받게 된다.
또한 입력 받은 배열의 길이가 1일때(len == 1) 는 그것이 공백인지 확인하고, 공백이라면 0을 출력하게 한다.
마지막으로 런타임에러가 뜬다면 배열 크기를 키워보자! 처음에 str[1000]하니까 런타임 에러가 떴었는데 할당을 많이 하니 맞았다!!
끝!