45.8 특정 단어 개수 세기
, 양 승현님이 작성#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int8_t* s1 = malloc(sizeof(int8_t) * 1001);
scanf("%[^\n]s", s1);
int8_t* ptrthe = strtok(s1, " .,'");
int32_t thecount = 0;
while (ptrthe != NULL)
{
if (strcmp(ptrthe, "the") == 0)
{
thecount++;
}
ptrthe = strtok(NULL, " .,'");
}
printf("%d\n", thecount);
free(s1);
return 0;
}
UNIT 45.8 심사문제입니다.
위 코드에서 while문 안에 if조건문에서 ptrthe포인터값이 the와 같을 때만 thecount를 1 증가시키는데,
해셜에서는 NULL이 아닐때도 if조건문 안에 넣어야된다고 나와있습니다.
소스코드를 입력해보면 ptrthe != NULL 을 넣지 않아도 통과가 되는데 NULL이 아닐 때의 조건의 꼭 입력해야하나요?
어차피 NULL도 the문자열과 다르기 때문에 if 조건문의 코드가 실행되지 않는거 아닌가요?
Re: 45.8 특정 단어 개수 세기
, 도장_ 관리자님이 작성문자열을 자른 직후에는 결과가 NULL일 수 있습니다.
다만, 문자열을 자른 위치에 따라 작성하는 코드가 다를 수 있습니다.
while (ptrthe != NULL){
if (strcmp(ptrthe, "the") == 0)
{
thecount++;
}
ptrthe = strtok(NULL, " .,'");
}
이것도 방법이지만, 통상은
while (ptr != NULL)
{
ptr = strtok(NULL, " .,");
if (ptr != NULL && strcmp(ptr, "the") == 0)
count++;
}
{
ptr = strtok(NULL, " .,");
if (ptr != NULL && strcmp(ptr, "the") == 0)
count++;
}
이와 같은 방식입니다.
문자열을 자른 이후에 strcmp를 호출하는 방식이라면 NULL 검사를 하지만,
작성한 코드처럼 문자열을 마지막에 자르고 while 조건식에서 ptr != NULL로 검사하기
때문에 if에서 검사할 필요가 없어지는 것의 차이입니다.
정답 코드를 작성하는 방식은 여러 가지가 있습니다. 해설은 일반적인 방식에 대한 것입니다.