IT

C: strtok_r의 올바른 사용법

itgroup 2023. 6. 17. 09:00
반응형

C: strtok_r의 올바른 사용법

strtok 대신 strtok_r을 사용하려면 어떻게 해야 합니까?

char *pchE = strtok(NULL, " ");

이제 사용하려고 합니다.strtok_r제대로...하지만 가끔 문제가 생길 때가 있습니다.strtol저는 10번(동시에) 실행하는 스레드가 있습니다.

char *savedEndd1;
char *nomeClass = strtok_r(lineClasses, " ", &savedEndd1);
char *readLessonS = strtok_r (NULL, " ", &savedEndd1);
char *readNTurma = strtok_r(NULL, " ",  &savedEndd1);

if (readNTurma==NULL)
printf("CLASS STRTOL begin %s %s\n",nomeClass, readLessonS );
int numberNTurma = strtol(readNTurma, NULL, 10);

그리고 나는 그것을 이해합니다.readNTurma == NULL여러 번...왜 그런 것일까요?그것이 왜 왔는지 이해할 수 없습니다.NULL?

strtok_r에 대한 설명서는 매우 명확합니다.

strtok_r() 함수는 재입력 버전 strtok()입니다.saveptr 인수는 동일한 문자열을 구문 분석하는 연속 호출 간의 컨텍스트를 유지하기 위해 strtok_r()에서 내부적으로 사용하는 char * 변수에 대한 포인터입니다.

strtok_r()에 대한 첫 번째 호출에서 str은 구문 분석할 문자열을 가리켜야 하며 saveptr 값은 무시됩니다.이후 호출에서는 str이 NULL이어야 하며 saveptr은 이전 호출 이후 변경되지 않아야 합니다.

그래서 당신은 다음과 같은 코드를 가지고 있습니다.

char str[] = "Hello world";
char *saveptr;
char *foo, *bar;

foo = strtok_r(str, " ", &saveptr);
bar = strtok_r(NULL, " ", &saveptr);

테스트된 예:

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

int main(void)
{
    char str[] = "1,22,333,4444,55555";
    char *rest = NULL;
    char *token;

    for (token = strtok_r(str, ",", &rest);
         token != NULL;
         token = strtok_r(NULL, ",", &rest)) {   
        printf("token:%s\n", token);
    }

    return 0;
}

결과.

token:1
token:22
token:333
token:4444
token:55555

테스트: http://codepad.org/6xRdIecI

강조할 은 Linux 설명서에서 확인:

char *strtok_r(char *str, const char *delim, char **saveptr);

strtok_r() 함수는 재입력 버전 strtok()입니다.saveptr 인수는 동일한 문자열을 구문 분석하는 연속 호출 간의 컨텍스트를 유지하기 위해 strtok_r()에서 내부적으로 사용하는 char * 변수에 대한 포인터입니다.

strtok_r()에 대한 첫 번째 호출에서 str은 구문 분석할 문자열을 가리켜야 하며 saveptr 값은 무시됩니다. 이후 호출에서는 str이 NULL이어야 하며 saveptr은 이전 호출 이후 변경되지 않아야 합니다.

서로 다른 saveptr 인수를 지정하는 strtok_r() 호출 시퀀스를 사용하여 서로 다른 문자열을 동시에 구문 분석할 수 있습니다.

둥지에서 strtok()을 사용하는 대신 strtok_r()의 올바른 사용법을 이해하기 위해 테스트된 예를 게시합니다.

먼저 "y.o.u,a.r.e,h.e.r.e" 문자열을 사용하고 구분 기호 "," 및 "."를 사용하여 구분합니다.

strtok 사용하기

#include<stdio.h>
#include<string.h>
int main(void) {

        char str[]="y.o.u,a.r.e,h.e.r.e";
        const char *p=",", *q=".";
        char *a,*b;

        for( a=strtok(str,p) ; a!=NULL ; a=strtok(NULL,p) ) {
                printf("%s\n",a);
                for( b=strtok(a,q) ; b!=NULL ; b=strtok(NULL,q) )
                        printf("%s\n",b);
        }

        return 0;
}

출력:

y.o.u
y
o
u

이제 동일한 예에 strtok_r()를 사용하겠습니다.

strtok_r() 사용

#include<stdio.h>
#include<string.h>
int main(void) {

        char str[]="y.o.u,a.r.e,h.e.r.e";
        const char *p=",",*q=".";
        char *a,*b,*c,*d;

        for( a=strtok_r(str,p,&c) ; a!=NULL ; a=strtok_r(NULL,p,&c) ) {
                printf("%s\n",a);

                for( b=strtok_r(a,q,&d) ; b!=NULL ; b=strtok_r(NULL,q,&d) )
                        printf("%s\n",b);
        }

        return 0;
}

출력:

y.o.u
y
o
u
자동 기록 장치
a
r
e
H.E.R.E.
h
e
r
e

따라서 strtok_r()는 재진입 속성을 가지고 있는 반면 strtok()는 그렇게 기능하지 않습니다.

char str[]="string for sample";
char *reserve;
char *pchE = strtok_r(str, " ", &reserve);//when next call str -> NULL

언급URL : https://stackoverflow.com/questions/15961253/c-correct-usage-of-strtok-r

반응형