2014-09-02 7 views
0

이 샘플 프로그램에서는 문자열을 두 개의 토큰으로 분할하기 위해 strtok_r을 사용합니다.strtok_r의 내부 포인터를 사용하는 것이 안전합니까?

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char buf[] = "Hello World!"; 
    char tok[] = " "; 
    char *p; 

    char *retStr = strtok_r(buf, tok, &p); 
    printf("\"%s\" \"%s\"\n", retStr, p); 
    return 0; 
} 

이 프로그램의 출력 포인터 p 재진입 목적 strtok_r 내부적으로 사용되는 man page 따르면

"Hello" "World!" 

이다. 내가 여기에있는 것처럼 그것은 문자열의 나머지 부분을 가리키는 것으로 가정하는 것이 안전할까요?

+0

명시 적으로 지정되어 있지 않으므로 이에 의존하지 않습니다. 구현으로 일부 특수 내부 구조를 가리킬 수 있습니다 (매우 드물지 만 정리가 어렵습니다). – Dave

+0

좀 더 현실적인 모호성은 최신 토큰을 가리키는 지 아니면 최신 토큰 이후의 공간인지 또는 그 변형을 나타내는 것입니다. – Dave

답변

1

아니요 안전하지 않습니다. 설명서에 따르면 strtok_r은 포인터를 내부 용도로 사용하며 strtok_r 호출 사이에는 사용자가 변경하면 안됩니다. 즉, 문자열의 나머지 부분을 가리키고 있지만 그것이 사고의 종류이며 라이브러리 구현자가 변경할 수 있다는 것을 알았지 만 외부 라이브러리가 변경되어 프로그램이 작동을 멈추는 것을 의미합니다. 나는 그러한 불필요한 의존성을 피할 것이다.

1

구체적으로 이라고 말하면 허용 할 수없는 것보다 더 많은 것을 기대할 수 있습니다.

무언가를 사용하는 방법에 대한 문서의 모호성 때문에 개발자는 변경 사항없이 버전간에 사용 방법을 변경할 수 있습니다. 그래서, 당신이하고있는 일이 지금은 효과가 있을지 모르지만, 다음 라이브러리에서 작동 할 guaruntee는 없습니다.