위가 제가 작성한 코드인데 안돌아가는 이유가 무엇때문인지가 궁금합니다.
해당 챕터에서 배운 함수(strstr, strchr)들중 제가 사용하지 않은게 있는 것인지요?
저는 문제를 풀때 그것들을 사용하지 않고 이런식으로 푸는게 맞다고 생각해서 사용하지 않았던 것 같습니다.
https://glot.io/snippets/fjjjuv2wyr
코드를 실행해보면 입력 값에 대한 결과가 출력되지 않습니다.
실행시간 제한 3초를 넘겨서 강제 종료되는 것을 알 수 있습니다.
심사문제 제출을 하면 해설이 있습니다.
길이 1,000 이하의 문자열이 입력된다고 했으므로 널 문자까지 포함하여 char 1001개 크기의 배열을 만들거나, 1001바이트 크기로 메모리를 할당합니다. 그리고 scanf 함수에 "%[^\n]s"를 지정하여 공백을 포함한 문자열을 입력받습니다.
여기서 공백의 개수를 세려면 while 반복문 안에서 strchr 함수로 ' '를 검색하면서 정수형 변수를 1씩 증가시키면 됩니다. strstr 함수를 사용한다면 " "를 검색하면 됩니다.
최대 1천자까지 입력된다면 끝에 NULL 문자가 저장될 공간이 필요하니까 1001바이트 크기로 메모리를 할당해야 한다고 힌트가 되어 있습니다.
문제를 해결하는 방법은 여러 가지가 있으나 해설에서는 strchr 함수나 strstr 함수를 사용해서 문제를 해결할 것을 권하고 있습니다.
Visual Studio에서 컴파일 로그를 보면
warning C4130: '==': 문자열 상수의 주소에서 논리 연산을 수행했습니다.
ptr은 포인터이고, ptr은 주소를 가리킵니다. 값을 참조하려면 역참조 연산자 *이 필요합니다. 따라서 다음 코드는 잘못된 코드입니다. 포인터에 쓸 수 없는 연산자입니다.
if (ptr == " ") // 공백이라면
"은 문자열이고, '은 문자입니다. C 언어는 문자열에 대해서 네이티브 지원이 없습니다.
>>> "hello" == "world"
False
>>>
파이썬은 이러한 연산이 가능하지만, C 언어는 안 됩니다.
UNIT 44.1과 44.3을 보면 문자나 문자열을 검색할 때 연산자가 아니라 함수를 사용하고 있습니다.
해당 함수를 사용하거나 아니면 해당 함수와 같은 동작을 하는 함수를 직접 구현해서 문제를 해결해야 합니다.