Split-string-mit-Trennzeichen in C
Wie kann ich eine Funktion schreiben, die geteilt werden und liefert ein array für eine Zeichenkette mit Trennzeichen in der Programmiersprache C?
char* str = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC";
str_split(str,',');
Sie können die
stackoverflow.com/questions/8461170/...
Ein Kommentar...der entscheidende Punkt für eine
strtok
- Funktion aus der standard-Bibliothek, das gleiche zu erreichen.stackoverflow.com/questions/8461170/...
Ein Kommentar...der entscheidende Punkt für eine
strtok()
Familie Funktion ist das Verständnis static variables
in C. d.h., wie Verhalten Sie sich zwischen aufeinander folgenden Funktionsaufruf in denen Sie verwendet werden. Siehe meinen code untenInformationsquelleAutor namco | 2012-02-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die
strtok()
Funktion zum aufteilen einer Zeichenkette (und geben Sie das Trennzeichen zu verwenden). Beachten Sie, dassstrtok()
wird, ändern Sie die Zeichenfolge an Sie übergeben. Wenn die ursprüngliche Zeichenfolge erforderlich ist anderswo kopieren Sie es und geben Sie die Kopie anstrtok()
.EDIT:
Beispiel (Hinweis: es behandelt nicht aufeinander folgende Trennzeichen, "JAN, FEB,MAR" zum Beispiel):
Ausgabe:
strtok
markiert ist, als überholt vonstrsep(3)
in der man-Seite.Wie kann dies die kanonische Frage/Antwort auf Stack Overflow für dieses, gibt es keine Einschränkungen bezüglich multi-threading mit strtok?
Laut dieser Seite
strsep
ist ein Ersatz fürstrtok
, aberstrtok
wird bevorzugt für die Portabilität. So, es sei denn, Sie benötigen support für leere Felder oder Spalten mehrere Zeichenketten auf einmalstrtok
ist die bessere Wahl.Es erinnert sich an Sie; das ist einer der Gründe, warum es problematisch ist. Es wäre besser, verwenden
strtok_s()
(Microsoft, C11 Anhang K, optional) oderstrtok_r()
(POSIX) als plainstrtok()
. Plainstrtok()
ist das böse in eine library-Funktion. Keine Funktion ruft die Bibliothek-Funktion kann mitstrtok()
an der Zeit, und keine Funktion, die aufgerufen wird, die von der library-Funktion aufrufen kannstrtok()
.Nur ein Hinweis, dass
strtok()
ist nicht thread safe (für die Gründe @JonathanLeffler erwähnt) und daher eine ganze Funktion ist nicht thread-sicher. Wenn Sie versuchen, dies zu nutzen, eine profilierte Umgebung, bekommst du erratischen und unvorhersehbaren Ergebnissen. Ersetzenstrtok()
fürstrtok_r()
behebt dieses Problem.InformationsquelleAutor hmjd
Ich denke
strsep
ist immer noch das beste Werkzeug für diese:Dass ist buchstäblich eine Linie, die teilt eine Zeichenfolge.
Die zusätzlichen Klammern sind ein Stilelement, um zu zeigen, dass wir absichtlich testen das Ergebnis einer Zuweisung, keine Gleichheit-operator
==
.Für dieses Muster zu arbeiten,
token
undstr
beide vom Typchar *
. Wenn Sie begann mit einem string-literal, dann würden Sie wollen, um eine Kopie des ersten:Wenn zwei Trennzeichen erscheinen zusammen in
str
werden, erhalten Sie einetoken
Wert die leere Zeichenkette. Der Wert vonstr
geändert wird, dass jeder delimiter aufgetreten ist überschrieben mit einem null-byte - ein weiterer guter Grund, um kopieren Sie die Zeichenfolge analysiert wird ersten.In einem Kommentar, jemand schlug vor, dass
strtok
ist besser alsstrsep
weilstrtok
ist mehr tragbar. Ubuntu und Mac OS X habenstrsep
; es ist sicher zu erraten, dass andere unixy Systeme zu tun, wie gut. Windows fehltstrsep
, aber es hatstrbrk
die es ermöglicht, diese kurz und bündigstrsep
Ersatz:Hier ist eine gute Erklärung
strsep
vsstrtok
. Die vor-und Nachteile beurteilt werden dürfen subjektiv, aber ich denke, es ist ein beredtes Zeichen dafür, dassstrsep
wurde konzipiert als Ersatz fürstrtok
.Ich war nur um zu Fragen... Pelle s C strdup(), aber keine strsep().
warum
tofree
ist der eine frei hatte und nichtstr
?Sie können nicht frei
str
weil Ihr Wert kann verändert werden, indem Anrufe anstrsep()
. Der Wert vontofree
konsequent Punkte zu Beginn der Speicher, den Sie möchten, frei.InformationsquelleAutor Tyler
String tokenizer dieser code sollte dich in die richtige Richtung.
InformationsquelleAutor thenetimp
Methode unten wird alles tun, den job (Speicher-Zuordnung, das zählen der Länge) für Sie. Mehr Informationen und die Beschreibung kann hier gefunden werden - Implementierung von Java-String.split () - Methode, split-C-string
Wie es zu benutzen:
beste Lösung! 🙂
Wenn ich das mache, entweder es fügt zu viel, um das Letzte token, oder weist es zu viel Speicher. Dies ist die Ausgabe:
found 10 tokens. string #0: Hello, string #1: this string #2: is string #3: a string #4: test string #5: module string #6: for string #7: the string #8: string string #9: splitting.¢
Dieses Beispiel hat mehrere memory-leaks. Für alle, die dies Lesen, nicht mit diesem Ansatz. Lieber strtok oder strsep tokenization Ansätze statt.
InformationsquelleAutor user1090944
Hier ist meine zwei Cent:
Verwendung:
Dank den Menschen, die alle über strtok Antworten didnot funktionierte in meinem Fall auch noch nach eine Menge Anstrengungen, und Ihr code funktioniert wie ein Charme!
InformationsquelleAutor razzak
Im obigen Beispiel, es würde eine Möglichkeit zur Rückgabe eines Arrays von null-terminierten strings (wie Sie wollen) an die Stelle in der Zeichenfolge. Wäre es nicht machen es möglich, übergeben Sie einen string-literal obwohl, wie müsste es verändert werden, indem die Funktion:
Es ist wohl ein ordentlicher Weg, es zu tun, aber Sie bekommen die Idee.
InformationsquelleAutor Matt
Diese Funktion einen char* - string und teilt es durch die deliminator. Es können mehrere deliminators in einer Reihe. Beachten Sie, dass die Funktion verändert den originalen string. Sie müssen eine Kopie der original-string zuerst, wenn Sie brauchen die Originale bleiben unverändert. Diese Funktion benutzt keine cstring-Funktion aufruft, so ist es vielleicht ein wenig schneller als andere. Wenn Sie kümmern sich nicht um die Speicherreservierung, die Sie zuordnen können sub_strings am Anfang der Funktion mit Größe strlen(src_str)/2 und (wie die c++ "version" genannt) überspringen Sie die untere Hälfte der Funktion. Wenn Sie dies tun, die Funktion reduziert sich auf O(N), aber der Speicher optimiert unten gezeigt wird, ist O(2N).
Die Funktion:
, Wie es zu benutzen:
InformationsquelleAutor Sam Petrocelli
InformationsquelleAutor adamsch1
Versuchen, verwenden Sie diese.
InformationsquelleAutor David Jr.
Unten ist mein
strtok()
Umsetzung von zString Bibliothek.zstring_strtok()
unterscheidet sich von der standard-Bibliothekstrtok()
in der Art, es behandelt aufeinander folgende Trennzeichen.Werfen Sie einen Blick auf den code unten,sicher, dass Sie erhalten eine Idee über, wie es funktioniert (ich habe versucht, so viele Kommentare wie ich konnte)
Unten ist ein Beispiel für die Verwendung...
Die Bibliothek kann von Github heruntergeladen werden
https://github.com/fnoyanisi/zString
InformationsquelleAutor fnisi
Dies ist ein string-splitting-Funktion kann mit den multi-Charakter-Trennzeichen. Beachten Sie, dass, wenn das Trennzeichen ist länger als der string, der aufgeteilt wird, dann
buffer
undstringLengths
auf(void *) 0
, undnumStrings
auf0
.Dieser Algorithmus wurde getestet und funktioniert. (Disclaimer: Es wurde nicht getestet, für nicht-ASCII-strings, und es wird davon ausgegangen, dass der Anrufer gab Gültiger Parameter)
Beispielcode:
Bibliotheken:
Hinzugefügt Beispielcode.
Zuordnung Logik ist falsch. realloc() gibt neue Zeiger und werfen Sie zurückgegebene Wert. Keine richtige Weg, um wieder neuen Speicher-Zeiger - Funktion Prototyp geändert werden sollten, zu akzeptieren, die Größe der zugewiesenen
buffer
verlassen und Zuordnung zum aufrufenden Prozess max Größe Elemente.Feste, komplett umgeschrieben und getestet. Hinweis: nicht sicher, ob diese arbeiten werden für nicht-ASCII-Zeichen oder nicht.
InformationsquelleAutor Élektra
Mein Ansatz ist, Scannen Sie die Zeichenfolge und lassen Sie die Zeiger, zeigen Sie auf jedes Zeichen nach dem deliminators(und die ersten Buchstaben), gleichzeitig weisen die Erscheinungen der deliminator in string mit '\0'.
Machen Sie zuerst eine Kopie der original-string(da Sie konstant ist), dann bekommen Sie die Anzahl der splits, die durch das Scannen Sie übergeben es an Zeiger-parameter len. Danach Stelle die ersten Ergebnis-Zeiger auf den string kopieren Zeiger, und Scannen Sie anschließend die Kopie string: einmal auch eine deliminator, weisen Sie es auf '\0' also das Ergebnis der vorherigen Zeichenkette, und zeigen Sie das nächste Ergebnis-string Zeiger auf das nächste Zeichen Zeiger.
InformationsquelleAutor metalcrash
Diese optimierte Methode erstellen (oder ein vorhandenes aktualisieren) array von Zeigern in *result und gibt die Anzahl der Elemente in *zählen.
Verwenden Sie "max", um anzugeben, die maximale Anzahl der Zeichenfolgen, die Sie erwarten (wenn Sie angeben, dass ein vorhandenes array oder jede andere reaseon), sonst setzen Sie es auf 0
Zu vergleichen mit einer Liste von Trennzeichen definieren delim als char* und ersetzen Sie die Zeile:
mit den folgenden zwei Zeilen:
Genießen
Beispiel:
InformationsquelleAutor luxigo
Mein code (getestet):
Ergebnis:
InformationsquelleAutor DaTaiMeo
Ich denke, die folgende Lösung ist ideal:
Erklärung des Codes:
token
zu speichern, die Adresse und die Länge des Tokenstr
ist völlig Separatoren, so gibt esstrlen(str) + 1
Token, alle leeren Saiten
str
Aufnahme der Adresse und Länge jedes tokenNULL
sentinel-WertInformationen - Verwendung
memcpy
wie es ist schneller alsstrcpy
und wir wissendie Längen
Hinweis:
malloc
überprüfung der Kürze halber weggelassen.Im Allgemeinen, ich würde nicht geben ein array zurück, der
char *
Tipps von einem split-Funktion wie diese, da es Orte, die eine Menge Verantwortung auf den Anrufer zu befreien, Sie richtig. Eine Schnittstelle, die ich bevorzuge, ist, damit der Anrufer zu übergeben, eine callback-Funktion und rufen Sie diese für jede Spielfigur, wie ich Sie hier geschildert habe: Split einen String in C.token
.InformationsquelleAutor Martin Broadhurst
Meine version:
InformationsquelleAutor Artem Samokhin
Nicht getestet, wahrscheinlich falsch, aber sollte geben Sie Ihnen einen guten Vorsprung, wie es funktionieren sollte:
*(str + begin)
sollte mindestensstr+begin
. und Ihre strncpy() nicht nul-beenden Sie die resultierende Zeichenfolge. Und Sie nicht zu Inkrement-str.InformationsquelleAutor jn1kk
Explodieren & implode - ursprüngliche string bleibt intakt, dynamische Speicherzuweisung
Verwendung:
InformationsquelleAutor Dawid Szymański
Wenn Sie bereit sind zu verwenden, um eine externe Bibliothek handelt, kann ich nicht empfehlen
bstrlib
genug. Es dauert ein wenig zusätzliche setup, aber ist einfacher zu bedienen, auf lange Sicht.Zum Beispiel, teilen Sie die Zeichenfolge unten, man erstellt zunächst ein
bstring
mit derbfromcstr()
nennen. (Einbstring
ist ein wrapper um einen char-buffer).Als Nächstes split den string an den Kommas, speichern das Ergebnis in einer
struct bstrList
, die Felderqty
und ein arrayentry
, die ein array vonbstring
s.bstrlib
hat viele weitere Funktionen zu bedienen, die aufbstring
sEasy as pie...
InformationsquelleAutor SAK
Gibt es einige Probleme mit strtok() hier aufgelistet: http://benpfaff.org/writings/clc/strtok.html
Daher ist es besser, vermeiden strtok.
Betrachten Sie nun eine Zeichenfolge, die ein leeres Feld wie folgt:
Können Sie einfache Funktion zu sein in der Lage, konvertieren von Zeichenfolgen in CSV-format zu Lesen, dass Sie ein float-Array:
Wir angegeben, Trennzeichen ist hier ein Komma. Es arbeitet mit anderen einzelnes Zeichen Trennzeichen.
Finden Sie die Nutzung unten:
Ausgabe ist wie folgt :
InformationsquelleAutor Sashank Bhogu
Für: Hassan A. El-Seoudy
Dein ticket geschlossen ist, so kann ich nicht darauf eingehen ^^'.
Aber Sie können versuchen, diese:
InformationsquelleAutor Hugo Lanoix
Noch eine andere Antwort (dies war bewegt hier von hier):
Versuchen, die strtok-Funktion:
finden Sie details zu diesem Thema hier oder hier
Das Problem hier ist, dass Sie zum verarbeiten der
words
sofort. Wenn Sie möchten, speichern Sie in einem array, das Sie bereitstellen müssencorrect size
für it-Hexe ist unbekannt.So zum Beispiel:
Hinweis:
Wir verwenden die gleiche Schleife und die Funktion zum berechnen der Anzahl (pass) und für die Herstellung der Kopien (pass), um zu vermeiden, dass allocation.
Note 2:
Sie können verwenden einige andere Umsetzung der strtok die Gründe erwähnen, die in separaten posts.
Diese können Sie verwenden, wie:
(Ich habe es nicht testen, also bitte lassen Sie mich wissen, wenn es nicht funktioniert!)
InformationsquelleAutor SchLx
InformationsquelleAutor Pankaj
Diese lösen kann Ihren Zweck
Ausgabe :
InformationsquelleAutor Sifat Haque
Dies ist anderen Ansatz, arbeiten für große Dateien zu.
Demo: https://onlinegdb.com/BJlWVdzGf
InformationsquelleAutor Ilian Zapryanov