Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:正确使用strtok\u r_C_Char_Strtok - Fatal编程技术网

C:正确使用strtok\u r

C:正确使用strtok\u r,c,char,strtok,C,Char,Strtok,如何使用strtok_r而不是strtok来执行此操作 char *pchE = strtok(NULL, " "); 现在我正试图正确地使用strtok\r。。。但有时我会遇到使用strtol的问题。 我有一个线程,我执行了10次(同时) 我多次捕捉到readNTurma==NULL。。。为什么呢?我不明白为什么会出现空值?对于strtok\u r的定义非常清楚 char str[]="string for sample"; char *reserve; char *pchE = strto

如何使用strtok_r而不是strtok来执行此操作

char *pchE = strtok(NULL, " ");
现在我正试图正确地使用strtok\r。。。但有时我会遇到使用strtol的问题。 我有一个线程,我执行了10次(同时)

我多次捕捉到
readNTurma==NULL
。。。为什么呢?我不明白为什么会出现空值?

对于strtok\u r的定义非常清楚

char str[]="string for sample";
char *reserve;
char *pchE = strtok_r(str, " ", &reserve);//when next call str -> NULL
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);
测试示例:

#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;
}
测试:

我的重点是:

char *strtok_r(char *str, const char *delim, char **saveptr);
strtok_r()函数是strtok()的可重入版本saveptr参数是指向char*变量的指针,strtok_r()在内部使用该变量,以便在解析相同字符串的连续调用之间维护上下文

在第一次调用strtok_r()时,str应该指向要分析的字符串,并且忽略saveptr的值。在后续调用中,str应为NULL,saveptr应自上次调用以来保持不变

可以使用指定不同saveptr参数的strtok_r()调用序列同时解析不同的字符串


我发布了一个测试示例,以了解strtok_r()的正确用法,而不是在嵌套中使用strtok()

首先让我们用一个字符串“y.o.u,a.r.e,h.e.r.e” 并使用分隔符“,”和“.”分隔

使用strtok()

#包括
#包括
内部主(空){
char str[]=“y.o.u,a.r.e,h.e.r.e”;
常量字符*p=“,”,*q=“.”;
字符*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);
}
返回0;
}
输出:

y、 o.u
y
o
u

现在让我们将strtok_r()用于相同的示例

使用strtok_r()

#包括
#包括
内部主(空){
char str[]=“y.o.u,a.r.e,h.e.r.e”;
常量字符*p=“,”,*q=“.”;
字符*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);
}
返回0;
}
输出:

y、 o.u
y
o
u
a、 r.e
a
r
e
h、 e.r.e
h
e
r
e

因此,strtok_r()具有可重入属性,而strtok()的功能不是这样的。

看到这个了吗
token:1
token:22
token:333
token:4444
token:55555
char *strtok_r(char *str, const char *delim, char **saveptr);
#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;
}
#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;
}