如何使用strtok_r而不是strtok来执行此操作?
char *pchE = strtok(NULL, " ");
Run Code Online (Sandbox Code Playgroud)
现在我正在努力使用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);
Run Code Online (Sandbox Code Playgroud)
而且我已经readNTurma == NULL
好几次了......为什么会这样?不明白为什么会这样NULL
?
tan*_*grs 40
strtok_r 的文档非常清楚.
strtok_r()函数是一个可重入的版本strtok().saveptr参数是指向char*变量的指针,该变量由strtok_r()在内部使用,以便在解析相同字符串的连续调用之间维护上下文.
在第一次调用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);
Run Code Online (Sandbox Code Playgroud)
MrH*_*DEn 14
经过测试的例子:
#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;
}
Run Code Online (Sandbox Code Playgroud)
结果.
token:1
token:22
token:333
token:4444
token:55555
Run Code Online (Sandbox Code Playgroud)
测试:http://codepad.org/6xRdIecI
从我的重点是我的linux文档:
char *strtok_r(char *str, const char *delim, char **saveptr);
Run Code Online (Sandbox Code Playgroud)
strtok_r()函数是一个可重入的版本strtok().saveptr参数是指向char*变量的指针,该变量由strtok_r()在内部使用,以便在解析相同字符串的连续调用之间维护上下文.
在第一次调用strtok_r()时,str应指向要解析的字符串,并忽略saveptr的值.在后续调用中,str应为NULL,并且自上次调用以来saveptr应保持不变.
可以使用指定不同saveptr参数的strtok_r()调用序列同时解析不同的字符串.
小智 6
我发布了一个经过测试的示例来了解 strtok_r() 的正确用法,而不是在嵌套中使用 strtok() 。
首先让我们取一个字符串“you,are,here”并使用分隔符“,”和“.”分开。
使用 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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
你
ÿ
Ø
ü
现在让我们在同一个例子中使用 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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
你
Ÿ
Ø
ü
是
一个
[R
ê
这里
^ h
é
[R
é
因此 strtok_r() 具有可重入属性,而 strtok() 没有那样的功能。