C: korrekte Verwendung von strtok_r

Lesezeit: 3 Minuten

Benutzeravatar von Carlcox89
Carlcox89

Wie kann ich strtok_r anstelle von strtok verwenden, um dies zu tun?

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

Jetzt versuche ich zu verwenden strtok_r richtig… Aber manchmal bekomme ich Probleme mit dem strtol. Ich habe einen Thread, den ich 10 Mal (gleichzeitig) ausführe.

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);

Und das fange ich an readNTurma == NULL mehrmals … Warum ist das so? Kann nicht verstehen, warum es kommt NULL?

  • siehe dies http://stackoverflow.com/questions/2227198/…

    – Grijesh Chauhan

    12. April 2013 um 0:45 Uhr

Benutzeravatar von tangrs
Tangr

Das Dokumentation für strtok_r ist ganz klar.

Die Funktion strtok_r() ist eine reentrante Version von strtok(). Das saveptr-Argument ist ein Zeiger auf eine char *-Variable, die intern von strtok_r() verwendet wird, um den Kontext zwischen aufeinanderfolgenden Aufrufen aufrechtzuerhalten, die denselben String parsen.

Beim ersten Aufruf von strtok_r() sollte str auf die zu parsende Zeichenfolge zeigen, und der Wert von saveptr wird ignoriert. Bei nachfolgenden Aufrufen sollte str NULL und saveptr seit dem vorherigen Aufruf unverändert sein.

Sie hätten also Code wie

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

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

Benutzeravatar von MrHIDEn
MrHIDEn

Getestetes Beispiel:

#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;
}

Ergebnis.

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

Prüfen: http://codepad.org/6xRdIecI

Aus Linux-Dokumentation wobei die Betonung von mir kommt:

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

Die Funktion strtok_r() ist eine reentrante Version von strtok(). Das saveptr-Argument ist ein Zeiger auf eine char *-Variable, die intern von strtok_r() verwendet wird, um den Kontext zwischen aufeinanderfolgenden Aufrufen aufrechtzuerhalten, die denselben String parsen.

Beim ersten Aufruf von strtok_r()str sollte auf die zu parsende Zeichenfolge zeigen, und der Wert von saveptr wird ignoriert. Bei nachfolgenden Aufrufen sollte str NULL und saveptr seit dem vorherigen Aufruf unverändert sein.

Unterschiedliche Zeichenfolgen können gleichzeitig analysiert werden, indem Sequenzen von Aufrufen von strtok_r() verwendet werden, die unterschiedliche saveptr-Argumente angeben.

Ich poste ein getestetes Beispiel, um die korrekte Verwendung von strtok_r() zu verstehen, anstatt strtok() in Verschachtelungen zu verwenden.

Nehmen wir zuerst eine Zeichenfolge “Sie, sind, hier” und trennen Sie sie mit den Trennzeichen “,” und “.”

mit 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;
}

AUSGANG:

Sie

j
Ö
u

Lassen Sie uns nun strtok_r() für dasselbe Beispiel verwenden

mit 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;
}

AUSGANG:

Sie
j
Ö
u
sind
a
r
e
hier
h
e
r
e

Daher hat strtok_r() eine reentrante Eigenschaft, während strtok() nicht so funktioniert.

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

1399390cookie-checkC: korrekte Verwendung von strtok_r

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy