eine Zeichenkette zweimal in c mit strtok ()

7

Ich verwende strtok() in c, um eine CSV-Zeichenfolge zu analysieren. Zuerst tokeniere ich es, um herauszufinden, wie viele Tokens es gibt, damit ich eine Zeichenfolge der richtigen Größe zuweisen kann. Dann gehe ich die gleiche Variable durch, die ich letztes Mal zur Tokenisierung benutzt habe. Jedes Mal, wenn ich es tue ein zweites Mal, obwohl es strtok(NULL, ",") Rendite NULL , obwohl es noch mehr Token zu analysieren sind. Kann mir jemand sagen, was ich falsch mache?

%Vor%

Also endet diese zweite While-Schleife immer, nachdem das erste Token gefunden wurde, obwohl es mehr Tokens gibt. Weiß jemand, was ich falsch mache?

    
SummerCodin 28.12.2010, 06:08
quelle

3 Antworten

16

strtok() ändert die Zeichenkette, in der es arbeitet, und ersetzt Trennzeichen durch Nullen. Wenn Sie es mehr als einmal verwenden möchten, müssen Sie eine Kopie erstellen.

    
Fred Larson 28.12.2010, 06:13
quelle
2

Es ist nicht unbedingt notwendig, eine Kopie zu erstellen - strtok() ändert die Zeichenkette, die es in Token zerlegt, aber in den meisten Fällen bedeutet das einfach, dass die Zeichenkette bereits in Token umgewandelt wurde, wenn Sie erneut mit den Tokens umgehen wollen.

Hier ist Ihr Programm ein wenig modifiziert, um die Token nach dem ersten Durchlauf zu verarbeiten:

%Vor%

Beachten Sie, dass dies leider kniffliger ist, als ich zuerst gepostet habe - der Aufruf von strspn() muss ausgeführt werden, nachdem das von strtok() platzierte '\ 0' übergangen wurde, da strtok() führende Trennzeichen für das Token überspringt gibt zurück (ohne das Trennzeichen in der Quelle zu ersetzen).

    
Michael Burr 28.12.2010 07:17
quelle
1

Verwenden Sie strspep - es aktualisiert Ihren Zeiger tatsächlich. In Ihrem Fall müssten Sie weiterhin NULL aufrufen und die Adresse Ihrer Zeichenfolge übergeben. Das einzige Problem mit strsep ist, wenn es zuvor auf dem Heap zugewiesen wurde, einen Zeiger auf den Anfang und dann später freilassen.

char * strsp (char ** Zeichenfolge, char * delim);

char * Zeichenfolge; char * Token; token = strsp (& amp; string, ",");

strtok wird in Ihrem normalen Intro zu C-Kurs verwendet - verwenden Sie strsep, es ist viel besser. :-) Keine Verwirrung auf "oh Scheiße - ich muss noch NULL übergeben, weil meine Position verschoben."

    
tperk 01.01.2011 21:35
quelle

Tags und Links