백준

백준 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]하니까 런타임 에러가 떴었는데 할당을 많이 하니 맞았다!! 

 

끝!