C언어 문자열 질문입니다

조회수 504회

아래의 코드는 문자열에서 문자열을 검색하는 기능을 하는 함수입니다. 코드를 분석하는 도중에 이해가 안되는 부분이 있어서 질문 드립니다.

아래 두개의 코드를 중에 첫번째는 정상 작동을 하는데 두번쨰 코드는 정상 작동 하지 않습니다.

1.<정상작동하는 코드>

#include <stdio.h>
char* my_strstr(char* str1, char* str2);
int main() {
    char str1[] = "iamaboyansdyour a girl";
    char str2[] = "boy";

    printf("%s\n", my_strstr(str1, str2) ? "두문자열은 서로를 포함한다" : "두문자열은 서로를 포함하지 않는다");

    return 0;
}
char* my_strstr(char* str1, char* str2) {

    char* s, * p;

    for (; *str1; str1++) {
        for (s = str1, p = str2; *s && *p && *s == *p; s++, p++) { ; }
            if (*p == 0) { return (char*)str1; }

    }
    return NULL;
}
  1. <정상작동 안하는 코드>
#include <stdio.h>
char* my_strstr(char* str1, char* str2);
int main() {
    char str1[] = "iamaboyansdyour a girl";
    char str2[] = "boy";

    printf("%s\n", my_strstr(str1, str2) ? "두문자열은 서로를 포함한다" : "두문자열은 서로를 포함하지 않는다");

    return 0;
}
char* my_strstr(char* str1, char* str2) {

    char* s, * p;

    for (; *str1; str1++) {
        for (s = str1, p = str2; *s && *p && *s == *p; s++, p++) {
            if (*p == 0) { return (char*)str1; }
        }
    }
    return NULL;
}

제가 궁굼한 부분은 사용자 정의 함수에서 두번째 포문의 블록 입니다.

for (s = str1, p = str2; *s && *p && *s == *p; s++, p++) { ; }
            if (*p == 0) { return (char*)str1; }

for (; *str1; str1++) {
        for (s = str1, p = str2; *s && *p && *s == *p; s++, p++) {
            if (*p == 0) { return (char*)str1; }
        }

위의 두 코드는 두번쨰 포문에서 블록의 범위가 달라지면 값도 달리지게 되던데 저는 두 코드의 차이점을 모르겠습니다. 그 이유는 두 코드 둘다 *p가 널을 만나게 되므로 (0) 그때의 주소값(str1)을 리턴하게 되는것으로 이해하고 있는데 실제로 작동해보면 첫번째 코드만 *p가 널을 만나 str1을 리턴하는 것으로 나옵니다.

제가 이해한 것을 좀더 설명해 보자면 첫번째 코드는 첫번째 포문을 평가 후 두번째 포문을 평가하게 되는데 두번째 포문을 완전히 평가 하고나서 마지막에 이프문을 평가하게 되고 두번째 코드는 첫번째 포문을 평가후 두번째 코드를 평가하면서 이프문을 같이 평가하게 되고 결국 두 코드는 *p가 널을 만났을때 리턴을 알아보는 것이므로 두번쨰 포문이 종료 후에 이프문을 평가하는거나 둘을 같이 평가하던 *p가 널을 만나게만 된다면 결국은 같은 의미의 코드로 보여지는데 아닌 이유가 궁금합니다.....

너무 졸려서 말도 이상한 것 같습니다 ㅠ 조금 더 자고와서 다시 연구해봐야 할듯 하네요 제가 이해한게 틀리다면 피드백 해주시면 감사하겠습니다

  • 첫번째 코드는 각 포인터가 널을 만난 후에 정상적으로 포인터를 리턴하지만, 두번째 코드는 각 포인터가 널을 가리킨 후에 for문에서 *s && *p && *s == *p 의 조건이 false 이기 때문에 안의 블록을 실행할 수 없습니다. 반복문 이후 *s 와 *p가 falsy 값 이라는 것을 놓치신게 아닌가 싶습니다. fornaything 2020.1.3 09:21
  • 아... 댓글 제가 코드 수정 수락하고나서 바로 달아주셨네요ㅠ 이제 봤네요 답변 감사드립니다! 현재는 질문 해결입니다!! 알 수 없는 사용자 2020.1.12 08:34

1 답변

  • 이미지

    if조건을 *p>=0 으로 해야합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 답변 감사드립니다! 질문이 해결 된 상태지만 코드 참고해서 보구싶은데 이미지가 깨져보이네요..ㅠ 알 수 없는 사용자 2020.1.12 08:39

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)