簡體   English   中英

C:正確使用strtok_r

[英]C: correct usage of strtok_r

如何使用strtok_r而不是strtok來執行此操作?

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參數是指向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;
}

結果。

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參數是指向char *變量的指針,該變量由strtok_r()在內部使用,以便在解析相同字符串的連續調用之間維護上下文

在第一次調用strtok_r()時 ,str應指向要解析的字符串,並忽略saveptr的值。 在后續調用中,str應為NULL,並且自上次調用以來saveptr應保持不變

可以使用指定不同saveptr參數的strtok_r()調用序列同時解析不同的字符串。

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

我發布一個測試的例子來了解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;
}

OUTPUT:


ÿ
Ø
ü

現在讓我們使用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;
}

OUTPUT:


ÿ
Ø
ü

一個
[R
Ë
這里
H
Ë
[R
Ë

因此strtok_r()具有可重入屬性,而strtok()不具有這樣的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM