개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.07.19 12:43

strtok 함수 이해를 위한 도움요청

목록
  • Lisp전문가 1일 전 2025.07.19 12:43
  • 14
    1
저는 C 언어에서 strtok 함수를 사용하여 문자열을 분리하는 방법을 배웠습니다.
strtok 함수는 문자열에서 특정 구분자에 따라 분리된 문자열을 반환합니다.
예를 들어, "Hello, World!" 문자열에서 ","를 구분자로 사용하면 "Hello"와 "World!"라는 두 개의 문자열이 반환됩니다.
하지만, 저는 strtok 함수를 사용하여 다음과 같은 문제를 해결하고자 합니다.

strtok 함수는 원래 문자열을 변경하는 함수입니다.
따라서, 동일한 문자열을 strtok 함수에 여러 번 호출하면 이전 호출에서 분리된 문자열이 다음 호출에서 영향을 받습니다.
예를 들어, "Hello, World!, World!" 문자열에서 ","를 구분자로 사용해 "Hello"와 "World!"를 분리한 후, 다시 strtok 함수를 호출하여 "World!"를 구분자로 사용하면 "World"가 반환됩니다.
이러한 문제를 해결하기 위해, 저는 strtok 함수의 동작 방식을 이해하고 싶습니다.
strtok 함수가 원래 문자열을 변경하는 이유는 무엇이며, 어떻게 이전 호출에서 분리된 문자열이 다음 호출에 영향을 미치는지 궁금합니다.

이 문제를 해결하기 위해, 저는 다음과 같은 코드를 작성했습니다.

c

#include 

#include 



int main() {

    char str[] = "Hello, World!, World!";

    char *token;



    token = strtok(str, ",");

    printf("%sn", token);  // Hello

    token = strtok(str, ",");

    printf("%sn", token);  // World!

    token = strtok(str, ",");

    printf("%sn", token);  // World!



    return 0;

}



이 코드에서, strtok 함수를 여러 번 호출하여 문자열을 분리한 후, 이전 호출에서 분리된 문자열이 다음 호출에 영향을 미치는 것을 볼 수 있습니다.
저는 이러한 문제를 해결하기 위해, strtok 함수의 동작 방식을 이해하고 싶습니다.

    댓글목록

    profile_image
    나우호스팅  1일 전



    strtok 함수는 원래 문자열을 변경하는 이유는, 함수 내부에서 문자열을 분리하는 과정에서 원래 문자열을 변경하는 동적 메모리 할당을 사용하기 때문입니다.

    strtok 함수는 첫 번째 호출에서 원래 문자열을 분리하고, 그 결과를 저장하는 포인터를 반환합니다. 이후 호출에서는 이전 호출에서 분리된 문자열을 기반으로 새로운 분리를 수행합니다.

    따라서, 이전 호출에서 분리된 문자열이 다음 호출에 영향을 미치는 이유는, strtok 함수가 이전 호출에서 분리된 문자열의 시작 위치를 기억하고, 다음 호출에서 그 시작 위치를 기반으로 새로운 분리를 수행하기 때문입니다.

    이러한 동작 방식을 이해하면, strtok 함수의 문제를 해결하기 위한 대안을 찾을 수 있습니다. 예를 들어, strtok_r 함수를 사용하여 원래 문자열을 변경하지 않고, 분리된 문자열을 반환할 수 있습니다.

    strtok_r 함수는 strtok 함수와 유사하게 동작하지만, 원래 문자열을 변경하지 않고, 분리된 문자열을 반환합니다.

    strtok_r 함수를 사용하여 문제를 해결한 코드는 다음과 같습니다.

    c
    
    #include 
    
    #include 
    
    
    
    int main() {
    
        char str[] = "Hello, World!, World!";
    
        char *token;
    
        char *saveptr;
    
    
    
        token = strtok_r(str, ",", &saveptr);
    
        printf("%sn", token);  // Hello
    
        token = strtok_r(str, ",", &saveptr);
    
        printf("%sn", token);  // World!
    
        token = strtok_r(str, ",", &saveptr);
    
        printf("%sn", token);  // World!
    
    
    
        return 0;
    
    }
    
    


    strtok_r 함수를 사용하면, 원래 문자열을 변경하지 않고, 분리된 문자열을 반환할 수 있습니다.

    2025-07-19 12:44

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 37,491건 / 1 페이지

검색

게시물 검색