Bitte erklären Sie mir die strtok()
Funktionsweise. Das Handbuch sagt, dass es die Zeichenfolge in Token zerlegt. Ich kann aus dem Handbuch nicht verstehen, was es tatsächlich tut.
Ich habe Uhren hinzugefügt str
und um *pch
zu überprüfen, ob es funktioniert, als die erste while-Schleife auftrat, war der Inhalt von str
nur "this". Wie wurde die unten gezeigte Ausgabe auf dem Bildschirm gedruckt?
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
Ausgabe:
Teilungszeichenfolge "- Dies ist eine Beispielzeichenfolge." in Token: Dies ein Stichprobe Zeichenfolge
strtok()
Ändert die Argumentzeichenfolge, indem Token vor der Rückkehr mit NUL beendet werden. Wenn Sie versuchen, den gesamten Puffer (str []) zu untersuchen, wird er zwischen aufeinanderfolgenden Aufrufen von geändertstrtok()
.str
, Uhrstr[0]
,str[1]
,str[2]
, ...Antworten:
strtok()
teilt die Zeichenfolge in Token. Das heißt, wenn Sie von einem der Begrenzer zum nächsten beginnen, ist dies Ihr einziger Token. In Ihrem Fall ist der Start-Token von "-" und endet mit dem nächsten Leerzeichen "". Dann beginnt der nächste Token mit "" und endet mit ",". Hier erhalten Sie "This" als Ausgabe. In ähnlicher Weise wird der Rest der Zeichenfolge von Raum zu Raum in Token aufgeteilt und schließlich der letzte Token auf "" beendet.quelle
Die strtok-Laufzeitfunktion funktioniert folgendermaßen
Wenn Sie strtok zum ersten Mal aufrufen, geben Sie eine Zeichenfolge an, die Sie tokenisieren möchten
In der obigen Zeichenfolge scheint der Leerzeichen ein gutes Trennzeichen zwischen den Wörtern zu sein. Verwenden wir also Folgendes:
Was jetzt passiert ist, dass 's' durchsucht wird, bis das Leerzeichen gefunden ist, das erste Token zurückgegeben wird ('this') und p auf dieses Token zeigt (Zeichenfolge)
Um das nächste Token zu erhalten und mit derselben Zeichenfolge fortzufahren, wird NULL als erstes Argument übergeben, da strtok einen statischen Zeiger auf Ihre zuvor übergebene Zeichenfolge beibehält :
p zeigt jetzt auf 'ist'
usw., bis keine Leerzeichen mehr gefunden werden können, wird die letzte Zeichenfolge als letzte Token-Zeichenfolge zurückgegeben.
bequemer können Sie es stattdessen so schreiben, um alle Token auszudrucken:
BEARBEITEN:
Wenn Sie die zurückgegebenen Werte speichern möchten,
strtok
müssen Sie das Token in einen anderen Puffer kopieren, z. B.strdup(p);
da die ursprüngliche Zeichenfolge (auf die der statische Zeiger im Inneren zeigtstrtok
) zwischen den Iterationen geändert wird, um das Token zurückzugeben.quelle
p
zeigt auf dieses Token" fehlt , besteht darin, dassstrtok
die ursprüngliche Zeichenfolge durch Platzieren von Nullzeichen anstelle eines Trennzeichens mutiert werden muss (andernfalls würden andere Zeichenfolgenfunktionen nicht wissen, wo der Token endet). Außerdem wird der Status mithilfe einer statischen Variablen verfolgt.strtok
verwaltet eine statische interne Referenz, die auf das nächste verfügbare Token in der Zeichenfolge verweist; Wenn Sie einen NULL-Zeiger übergeben, funktioniert dies anhand dieser internen Referenz.Dies ist der Grund, warum Sie
strtok
nicht wieder eintreten. Sobald Sie einen neuen Zeiger übergeben, wird diese alte interne Referenz blockiert.quelle
strtok
ändert den Parameter selbst nicht (str
). Dieser Zeiger wird gespeichert (in einer lokalen statischen Variablen). Es kann dann ändern , was dass Parameterpunkte in nachfolgenden Aufrufen , ohne den Parameter mit zurück übergeben. (Und es kann den Zeiger vorrücken, den es behalten hat, jedoch muss es seine Operationen ausführen.)Von der POSIX-
strtok
Seite:Es gibt eine thread-sichere Variante (
strtok_r
), die diese Art von Magie nicht ausführt.quelle
ctime
Zurückgeben einer statischen Zeichenfolge - praktisch (niemand muss sich fragen, wer sie freigeben soll), aber nicht erneut eintreten und Sie stolpern, wenn Sie sich dessen nicht sehr bewusst sind.strtok
Ändert den Parameter selbst nicht (str
)."puts(str);
druckt "- This" seitdemstrtok
geändertstr
.Wenn Sie es zum ersten Mal aufrufen, geben Sie die Zeichenfolge an, für die ein Token erstellt werden soll
strtok
. Um die folgenden Token zu erhalten, geben SieNULL
diese Funktion einfach an, solange sie einen Nicht-NULL
Zeiger zurückgibt .Die
strtok
Funktion zeichnet die Zeichenfolge auf, die Sie beim Aufrufen zuerst angegeben haben. (Was für Multithread-Anwendungen wirklich gefährlich ist)quelle
strtok wird einen String tokenisieren, dh in eine Reihe von Teilzeichenfolgen konvertieren.
Dazu werden Trennzeichen gesucht, die diese Token (oder Teilzeichenfolgen) trennen. Und Sie geben die Trennzeichen an. In Ihrem Fall möchten Sie '' oder ',' oder '.' oder '-' als Trennzeichen.
Das Programmiermodell zum Extrahieren dieser Token besteht darin, dass Sie Ihre Hauptzeichenfolge und die Trennzeichen mit der Hand strtok. Dann rufen Sie es wiederholt auf und jedes Mal gibt strtok das nächste gefundene Token zurück. Bis es das Ende der Hauptzeichenfolge erreicht, wenn es eine Null zurückgibt. Eine andere Regel ist, dass Sie die Zeichenfolge nur beim ersten Mal und NULL für die folgenden Male übergeben. Auf diese Weise können Sie strtok mitteilen, ob Sie eine neue Tokenisierungssitzung mit einer neuen Zeichenfolge starten oder Token aus einer vorherigen Tokenisierungssitzung abrufen. Beachten Sie, dass sich strtok seinen Status für die Tokenisierungssitzung merkt. Aus diesem Grund ist es nicht wiedereintritts- oder threadsicher (Sie sollten stattdessen strtok_r verwenden). Eine andere Sache zu wissen ist, dass es tatsächlich die ursprüngliche Zeichenfolge ändert. Es schreibt '\ 0' für die Trennzeichen, die es findet.
Eine Möglichkeit, strtok kurz und bündig aufzurufen, ist folgende:
Ergebnis:
quelle
strtok ändert seine Eingabezeichenfolge. Es werden Nullzeichen ('\ 0') eingefügt, sodass Bits der ursprünglichen Zeichenfolge als Token zurückgegeben werden. Tatsächlich weist strtok keinen Speicher zu. Sie können es besser verstehen, wenn Sie die Zeichenfolge als eine Folge von Feldern zeichnen.
quelle
Um zu verstehen, wie es
strtok()
funktioniert, muss man zuerst wissen, was eine statische Variable ist. Dieser Link erklärt es ganz gut ....Der Schlüssel für die Operation von
strtok()
besteht darin, den Speicherort des letzten Trennzeichens zwischen aufeinanderfolgenden Aufrufen beizubehalten (aus diesem Grund wirdstrtok()
weiterhin die sehr ursprüngliche Zeichenfolge analysiert, die an sie übergeben wird, wenn sie mit einemnull pointer
in aufeinanderfolgenden Aufrufen aufgerufen wird ).Schau dir meine an
strtok()
Implementierung an,zStrtok()
die eine etwas andere Funktionalität hat als die vonstrtok()
Und hier ist ein Beispiel für die Verwendung
Der Code stammt aus einer String-Verarbeitungsbibliothek, die ich auf Github verwalte und die zString heißt. Schauen Sie sich den Code an oder tragen Sie sogar dazu bei :) https://github.com/fnoyanisi/zString
quelle
So habe ich strtok implementiert. Nicht so toll, aber nach 2 Stunden Arbeit hat es endlich funktioniert. Es werden mehrere Trennzeichen unterstützt.
quelle
strtok ersetzt die Zeichen im zweiten Argument durch ein NULL-Zeichen und ein NULL-Zeichen ist auch das Ende eines Strings.
http://www.cplusplus.com/reference/clibrary/cstring/strtok/
quelle
Hier ist meine Implementierung, die eine Hash-Tabelle für das Trennzeichen verwendet, was bedeutet, dass es O (n) anstelle von O (n ^ 2) ist (hier ist ein Link zum Code) :
quelle
strtok () speichert den Zeiger in einer statischen Variablen, in der Sie zuletzt aufgehört haben. Wenn wir also beim zweiten Aufruf die Null übergeben, erhält strtok () den Zeiger von der statischen Variablen.
Wenn Sie denselben Zeichenfolgennamen angeben, beginnt er erneut von vorne.
Darüber hinaus ist strtok () destruktiv, dh es werden Änderungen an der ursprünglichen Zeichenfolge vorgenommen. Stellen Sie also sicher, dass Sie immer eine Kopie des Originals haben.
Ein weiteres Problem bei der Verwendung von strtok () besteht darin, dass beim Speichern der Adresse in statischen Variablen bei der Multithread-Programmierung das mehrmalige Aufrufen von strtok () einen Fehler verursacht. Verwenden Sie dazu strtok_r ().
quelle
Wer diese
strtok()
Funktion noch nicht richtig versteht , kann sich dieses Pythonontutor-Beispiel ansehen . Es ist ein großartiges Tool zur Visualisierung Ihres C-Codes (oder C ++, Python ...).Falls der Link unterbrochen wurde, fügen Sie Folgendes ein:
Credits gehen an Anders K.
quelle
Sie können das char-Array nach dem Token durchsuchen, wenn Sie festgestellt haben, dass es nur eine neue Zeile druckt. Andernfalls drucken Sie das char.
quelle
Dies ist also ein Code-Snippet, um dieses Thema besser zu verstehen.
Token drucken
Aufgabe: Geben Sie bei einem gegebenen Satz s jedes Wort des Satzes in einer neuen Zeile aus.
Eingang:
How is that
Ergebnis:
Erläuterung: Hier wird also die Funktion "strtok ()" verwendet und mit der for-Schleife iteriert, um die Token in separaten Zeilen zu drucken.
Die Funktion verwendet Parameter wie 'Zeichenfolge' und 'Haltepunkt' und bricht die Zeichenfolge an diesen Haltepunkten und bildet Token. Diese Token werden nun in 'p' gespeichert und zum Drucken weiter verwendet.
quelle