Heim > Artikel > Backend-Entwicklung > Wozu dient die Strtok-Funktion?
Verwendung der Strtok-Funktion: 1. Bearbeiten Sie die Zeichenfolge s, verwenden Sie die Zeichen in delim als Trennzeichen und teilen Sie s in eine Teilzeichenfolge auf. 2. Wenn s NULL ist, lautet der von der Funktion gespeicherte Zeiger [SAVE_PTR] wie folgt Wird als Startposition in einem Anruf verwendet.
Verwandte kostenlose Empfehlungen: Programmiervideokurs
Verwendung der Strtok-Funktion:
1. Einführung in die Funktion
Funktionsprototyp: char *strtok(char * s, char *delim)
Funktion: Wirkt auf die Zeichenfolge s, verwendet die Zeichen in delim als Trennzeichen und teilt s in eine Teilzeichenfolge auf; wenn s ein Nullwert NULL ist, wird der von der Funktion gespeicherte Zeiger SAVE_PTR aufgerufen Beim nächsten Mal wird Generalleutnant die Ausgangsposition einnehmen.
Rückgabewert: Der erste Substring, der vom Trennzeichen übereinstimmt.
2. Hauptinhalt
1. Die Funktion der Funktion besteht Die Zeichenfolge, auf die s zeigt. Die Position, an der das Trennzeichen zum ersten Mal im Inhalt erscheint. Das Trennzeichen wird in „/0“ geändert, sodass strtok() zum ersten Mal verwendet wird, um die erste Teilzeichenfolge zurückzugeben
Nachdem die Extraktion der ersten Teilzeichenfolge abgeschlossen ist, sollte dem ersten Parameter von strtok in nachfolgenden (zweiten, dritten, ... n-ten) Aufrufen der Nullwert NULL zugewiesen werden, um die Quellzeichenfolge s weiter zu extrahieren ( zeigt an, dass die Funktion mit der Extraktion fortfährt die Quellzeichenfolge aus dem vorherigen Aufruf) Die in einem Aufruf implizit gespeicherte Position zerlegt die Zeichenfolge für den vorherigen Aufruf weiter. Dieser Zeiger wird verwendet, um vor dem Ende des ersten Aufrufs auf das nächste Bit des Trennzeichens zu zeigen.
3.Wenn dies der Fall ist: Der Zeiger zeigt auf „
Das Ergebnis des ersten Aufrufs ist wie oben erwähnt: „,Fred“ wird extrahiert. Wir möchten auch weiterhin Leerzeichen als Grenzen verwenden, um das folgende „Männchen“ usw. zu extrahieren. Wie aus der obigen Abbildung ersichtlich ist, haben wir beim ersten Aufruf nach dem ersten Aufruf den Nullwert NULL an den ersten Parameter von strtok übergeben ( bedeutet, dass die Funktion die Zeichenfolge weiterhin von der im vorherigen Aufruf implizit gespeicherten Position aus zerlegt ; für den zweiten Aufruf, bevor der erste Aufruf endet, wird dieser Zeiger verwendet, um auf das nächste Bit des Trennzeichens zu zeigen, das die Position von 'm' () ist, sodass
und können nacheinander extrahiert werden. . . . Und so weiter. . . . .
Was den Grund angeht, warum Sie einen Nullwert zuweisen müssen, können Sie sich entweder an die Schlussfolgerung erinnern oder den Quellcode von strtok überprüfen. Am Ende dieses Artikels wird es eine Einführung geben.
Natürlich gibt es auch einige Leute, die gerne in Schwierigkeiten geraten und sich nicht an die Routine halten. Sie möchten sehen, welche Konsequenzen es hat, wenn sie dem Puffer weiterhin einen Wert zuweisen, ohne einen Nullwert zuzuweisen. Tatsächlich kann man sich die Antwort vorstellen. Das erneute Übergeben des Puffers entspricht der Suche nach dem Trennzeichen delim vom Anfang der Zeichenfolge, und der Puffer wurde zu diesem Zeitpunkt geändert (im sichtbaren Teil ist nur noch „,Fred“ übrig). Trennzeichen delim kann nicht gefunden werden.
Wie in „1“ erwähnt, Wenn der Teilstring extrahiert wird, wird der Rückgabewert von strtok (vorausgesetzt, der Rückgabewert ist dem Zeiger buf zugewiesen) Zeiger auf den Teilstring. Dieser Zeiger zeigt auf die Startposition des Teilstrings im Quellstring. Das nächste Zeichen am Ende der Teilzeichenfolge ist das Trennzeichen vor der Extraktion, wird aber nach der Extraktion in „/0“ geändert. Wenn also der Wert von buf gedruckt wird, kann der Inhalt der Teilzeichenfolge erfolgreich ausgegeben werden.
Welchen Wert gibt die Funktion zurück, wenn der Teilstring nicht extrahiert wird?
Wie Sie auf dem Bild oben sehen können, enthält der Puffer nicht das Trennzeichen delim. Nach dem Aufruf von strtok ist der Wert von buf
Da er nicht gefunden wurde, hat sich der Quellzeichenfolgenpuffer nicht geändert und der gedruckte Ausgabewert ist der vollständige Wert von die gesamte Zeichenfolge.
Wann ist der Rückgabewert einer Funktion NULL?
Baidu Encyclopedia sagt: „Wenn keine geteilte Zeichenfolge vorhanden ist, wird NULL zurückgegeben. “ Dies ist eine sehr mehrdeutige Aussage. Wenn Sie dieses Problem klar verstehen möchten, müssen Sie möglicherweise einen Blick auf das Implementierungsprinzip von strtok werfen. Hier ist zunächst eine experimentelle Erklärung.
Beim ersten Aufruf von strtok besteht kein Zweifel daran, dass buf auf „,Fred“ zeigt.
Rufen Sie strtok zum zweiten Mal auf. Da der erste Parameter NULL ist, bedeutet dies, dass die Funktion ab der beim letzten Aufruf gespeicherten Position dieses Zeigers weiter zerlegt wird, dh „männlich 25“ zerlegt. Nachdem die Zerlegung abgeschlossen ist, zeigt buf auf „männlich“.
Beim dritten Aufruf von strtok wird der Parameter weiterhin auf NULL gesetzt. Zu diesem Zeitpunkt beginnt die Zerlegung der Position dieses zum zweiten Mal gespeicherten Zeigers, dh „25“ wird zerlegt. Da die Teilzeichenfolge, die das Trennzeichen delim enthält, nicht gefunden werden kann, zeigt buf auf „25“.
Beim vierten Aufruf ist der Parameter immer noch NULL. Zu diesem Zeitpunkt zeigt der im dritten Aufruf gespeicherte Zeiger auf das Ende der Zeichenfolge „/0“ und kann nicht mehr zerlegt werden. Daher gibt die Funktion NULL zurück, was in der Baidu-Enzyklopädie erwähnt wird: „Die Funktion gibt NULL zurück, wenn keine geteilte Zeichenfolge vorhanden ist.“
Wenn viele Leute strtok verwenden, gehen sie davon aus, dass die Funktion vollständig mit dem Trennzeichen übereinstimmt delim beim Teilen einer Zeichenfolge. Beispiel: delim="ab", dann extrahiert die Funktion für die Zeichenfolge „acdab“ „acd“. Zumindest dachte ich das, als ich es zum ersten Mal benutzte. Tatsächlich haben wir uns alle geirrt, als ich mir den Quellcode der Funktion angesehen habe.
Das Ergebnis nach dem ersten Anruf war „Fred“, nicht das, was wir erwartet hatten. Warum ist das so?
Kehren wir zur Funktionsdefinition von strtok in der GNU C-Bibliothek zurück: „Parse S in durch Zeichen getrennte Token in DELIM“. Das heißt, die in delim enthaltenen Zeichen können als Trennzeichen anstelle einer strikten Übereinstimmung verwendet werden. Delim kann als eine Sammlung von Trennzeichen verstanden werden. Dieser Punkt ist sehr wichtig~
Natürlich verwenden wir beim Zerlegen einer Zeichenfolge selten mehrere Trennzeichen. Dies führt auch dazu, dass viele Leute beim Schreiben von Beispielen nur den Fall eines Trennzeichens diskutieren. Immer mehr Menschen missverstehen die Rolle von Trennzeichen, wenn sie sich Beispiele ansehen.
Das erste Zeichen, das das Trennzeichen ist, kann nicht als Sonderfall betrachtet werden. Strings können auch nach herkömmlichen Zerlegungsideen korrekt zerlegt werden.
Was ich hervorheben möchte, ist, dass strtok für diese Situation eine schnellere als normale Verarbeitungsmethode anwendet.
Wie im Beispiel oben gezeigt. Die durch Kommas getrennte Zeichenfolge „Fred male 25“ kann mit nur einem Aufruf erhalten werden, und das „,“ vor dem F wird ignoriert. Es ist ersichtlich, dass strtok beim Aufruf das Trennzeichen ab der Startposition ignoriert. Dies kann anhand des Quellcodes von strtok bestätigt werden.
Die Beispiele in diesem Artikel speichern alle den Quellstring als String-Array-Variable. Wenn Sie den Quellstring als Stringkonstante definieren, können Sie sich vorstellen, dass das Programm eine Ausnahme auslöst, weil die Funktion strtok versucht, den Wert des Quellstrings zu ändern.
Das obige ist der detaillierte Inhalt vonWozu dient die Strtok-Funktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!