회신: 45.8 심사문제입니다
, 도장_ 관리자님이 작성gets 함수를 사용하지 않습니다. 문제에 제시된 대로 scanf와 서식 지정자를 사용해서 입력 받으세요.
해설에 제시된 것처럼 strtok 함수에 " .,"를 사용해 문자열을 자르세요.
tok가 항상 NULL이 아닌지 검사해야 합니다.
나머지는 심사 문제의 해설을 참조하세요.
해설
길이 1,000 이하의 문자열이 입력된다고 했으므로 널 문자까지 포함하여 char 1001개 크기의 배열을 만들거나, 1001바이트 크기로 메모리를 할당합니다. 그리고 scanf 함수에 "%[^\n]s"를 지정하여 공백을 포함한 문자열을 입력받습니다(이하 변수는 s1).
그다음에 단어 수를 계산할 변수 count를 선언한 뒤 0으로 초기화하고, char *ptr = strtok(s1, " .,");와 같이 " .,"를 지정하여 공백, 점, 콤마를 기준으로 문자열을 자릅니다(공백만 지정해서 잘라도 되지만 the.나 the,와 같이 점이나 콤마로 끝나는 경우를 대비해 점과 콤마도 잘라줍니다). 그리고 strcmp 함수를 사용하여 잘린 문자열의 포인터 ptr과 "the"를 비교하여 같으면 count를 1 증가시킵니다.
while 반복문은 문자열이 나오지 않을 때까지 반복하도록 만들고, while 안에서는 strtok 함수의 자를 문자열 부분에 NULL을 넣어서 문자열을 계속 자릅니다. 그리고 strcmp 함수를 사용하여 잘린 문자열이 "the"인지 비교하여 같으면 count를 1 증가시킵니다. 이렇게 하면 문자열을 자를 때마다 "the"인지 비교한 뒤 맞으면 count가 1씩 증가하게 되므로 "the"의 개수를 구할 수 있습니다.
여기서 주의할 점이 있는데 strtok 함수에서 반환된 잘린 문자열의 포인터 ptr은 NULL일 수도 있으므로 ptr이 NULL이 아닐 때만 strcmp 함수로 비교해야 합니다. 만약 strcmp 함수에 NULL이 들어가면 에러가 발생합니다.