develop   3년 전

여기서 포인터 문자열 하나 선언해서 거기다가 따로 받아주니 고쳐지더라구요.

왜 포인터 따로 선언하지 않고 직접 하면 틀리는지 잘 모르겠습니다.


그리고,  문장 앞 뒤에 띄어쓰기를 입력해도 단어의 갯수는 정상적으로 나오던데,


strtok로 띄어쓰기를 구분해준다면 문장 앞 뒤에 있는 띄어쓰기도 갯수로 인식해야 정상 아닌가요?


왜 안세는지 잘 모르겠습니다

djm03178   3년 전

공백 하나만이 입력으로 주어지면 틀립니다.

develop   3년 전

아.. count+1 때문에 틀린거였군요!

그렇다면 혹시, 왜 strtok 를 문자열로 선언할 때는 count가 정상적으로 세지는지 여쭤봐도 될까요?

그리고, 문장 앞뒤에 띄어쓰기를 붙여도 횟수가 증가하지 않던데, 이게 어떤 원리로 건너 뛰는건지 궁금합니다..

djm03178   3년 전

무언가 달라진 것이 있을 때는 달라진 코드를 첨부하는 것이 매우 중요합니다.

정답을 받으신 코드를 보면 조건문이 while(tmp != NULL) 로 되어 있는데, 맨 처음 루프를 들어가기 전까지 strtok가 몇 번 실행되는지를 생각해 보면 차이점을 알 수 있습니다.

질문의 코드는 처음으로 while 문의 조건을 검사하지까지 두 번의 strtok가 실행되므로, 맨 첫 단어를 건너뛰고 두 번째 단어부터 세게 됩니다. 그래서 count + 1을 출력해야 됐던 것이고, 단어가 0개인 경우가 반례가 됐던 것입니다.

반면 정답을 받으신 코드에서는 처음 strtok가 한 번 실행된 결과가 먼저 tmp에 들어가고, 그 결과를 가지고 루프를 들어간 다음부터 바로 count를 세기 때문에 그대로 count를 출력하면 된 것입니다. 단어가 없을 경우 tmp가 처음부터 NULL이기 때문에 루프를 한 번도 들어가지 않아서 역시 정답을 출력합니다.

결국 포인터 변수를 사용했느냐가 정답 여부를 결정한 것이 아니라, strtok의 호출 위치가 포인트였다는 것을 알 수 있습니다.

djm03178   3년 전

맨 앞에 공백이 있어도 건너뛰어지는 이유는 뭔가 설명하기가 좀 그렇지만 그냥 그게 strtok의 동작 방식이기 때문입니다. 맨 처음에 delimiter가 있으면 무시하고 다음으로 넘어가는 거죠. 맨 마지막도 마찬가지로 맨 마지막에 delimiter가 있으면 바로 NULL을 반환하기 때문에 무시되는 것입니다.

develop   3년 전

와.. 감사합니다..

알면 알수록 너무 어렵네요.. 정말..

여기서부터 막히는거보면 적성이 아닌가..

진로에 대한 고민이 너무 많아집니다. ㅠㅠ 친절한 답변 감사합니다

댓글을 작성하려면 로그인해야 합니다.