Problem mit Funktion

Zvoni

Erfahrenes Mitglied
Möchte hier nur kurz anmerken, dass man im Zweifelsfall auch schnell im Voraus ermitteln kann, wie groß das Array sein muss.
Sind im String insgesamt n delimiter enthalten, wird er von der Funktion in n+1 Substrings gesplittet.

Gruß Technipion

Ist meiner Meinung nach mit Vorsicht zu geniessen.
Die Aussage stimmt nur, wenn immer nur ein Delimiter zwischen zwei Tokens ist.
Hast du aufeinander folgende Delimiter, stimmt die Aussage nicht.
"Hier,;.:-Test" --> 2 Tokens, 5 Delimiter
 

cwriter

Erfahrenes Mitglied
Ist meiner Meinung nach mit Vorsicht zu geniessen.
Die Aussage stimmt nur, wenn immer nur ein Delimiter zwischen zwei Tokens ist.
Hast du aufeinander folgende Delimiter, stimmt die Aussage nicht.
Stimmt auch, allerdings gilt das für Korrektheit wichtige alloc >= use dennoch.
In deinem Beispiel wären 6 Slots für 2 Tokens zwar nicht optimal, aber als schnelle Heuristik reicht es ja dennoch (ansonsten müsste man halt aus dem Loop eine kleine FSM machen, die einen Lookahead (bzw. Look-Behind) hat. Damit schwindet aber natürlich wieder Parallelisierbarkeit.

Gruss
cwriter
 

Zvoni

Erfahrenes Mitglied
Oder man wirft die Tokens, die strtok zurück gibt auf den Stack, lässt nebenher einen Zähler mitlaufen, wie oft push aufgerufen wurde.
Wenn strtok fertig ist, steht im Zähler die Anzahl an Tokens, die man dann als Anzahl Elemente für das Ergebnis-Array benutzt.
Dann nur noch vom Stack herunter-"poppen" und das Array rückwärts auffüllen
 

Technipion

Erfahrenes Mitglied
Ist meiner Meinung nach mit Vorsicht zu geniessen.
Die Aussage stimmt nur, wenn immer nur ein Delimiter zwischen zwei Tokens ist.
Hast du aufeinander folgende Delimiter, stimmt die Aussage nicht.
"Hier,;.:-Test" --> 2 Tokens, 5 Delimiter
Gut das kommt natürlich darauf an was die Funktion tun soll. Ich würde aus
"Wort1;Wort2;;Wort3;;;Wort4"
eiskalt das hier machen:
"Wort1", "Wort2", "", "Wort3", "", "", "Wort4"

Kommt aber natürlich darauf an. Möchte man das nicht, kann man ja bei der ersten Iteration des Strings (während man die Delimiter zählt) Wiederholungen gleich entfernen.

"Schnell" ist hier O(n) und offline + schlechte Cache-Locality. Egal bei kleinen Anwendungszwecken, bei ganz grossen/online vielleicht nicht.
Stimmt natürlich :D

Vorher erst mal noch die notwendige Arraygröße zu bestimmen macht quasi aus O(n) ein O(2n). Kommt eben auf den Anwendungsfall an. Wobei Tommy57 glaube ich nur Kommandozeileneingaben parsen will. Da wird wohl keiner von uns feststellen können, ob es nun 0,001 oder 0,00001 Blinzler dauert ;)...

Gruß Technipion
 

Zvoni

Erfahrenes Mitglied
Gut das kommt natürlich darauf an was die Funktion tun soll. Ich würde aus
"Wort1;Wort2;;Wort3;;;Wort4"
eiskalt das hier machen:
"Wort1", "Wort2", "", "Wort3", "", "", "Wort4"

Wobei aber strtok dir da keine Wahl lässt (versteh ich zumindest so).
Delimiter ist Delimiter und wird ignoriert.

Wobei Tommy57 glaube ich nur Kommandozeileneingaben parsen will.
Dann ist aber mMn strtok die falsche Funktion. Lustig wirds dann, wenn es um "quoted" Parameter geht, welche selbst Delimiter beinhalten (Leerzeichen z.B.).
Da benutze ich lieber die Kombination aus strspn und strcspn
 
Zuletzt bearbeitet: