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
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
'IT' 카테고리의 다른 글
충돌 분석 - 빌드/버전을 삭제하려면 어떻게 해야 합니까? (0) | 2023.06.17 |
---|---|
숫자 뒤에 'u'는 무슨 뜻입니까? (0) | 2023.06.17 |
MSAL(Microsoft Authentication Library for js)을 텍스트 대응 단일 페이지 응용 프로그램으로 올바르게 가져오고 사용하는 방법은 무엇입니까? (0) | 2023.06.17 |
유형 스크립트에서 중첩된 선택 <> 유형을 수행할 방법이 있습니까? (0) | 2023.06.17 |
엔티티 디렉토리가 구성 파일에 설정되지 않은 경우 ORM 유형이 엔티티를 찾을 수 없음 (0) | 2023.06.12 |