2016-04-06 14 views
-2

Ich laufe auf einem 32-Bit-Linux-System mit Std-C99 zuerst aus. Also habe ich diesen Codestrtok() gibt falschen Wert in C99 zurück?

Ausdruck ist eine C-Zeichenfolge übergeben als Parameter etwa wie "1 2 +". Und ich benutze Puts nur zu Testzwecken. Wenn ich jedoch valgrind mit dem Flag --leak-check = full anlege, gibt es mir einen ungültigen Lesewert der Größe 1 für strlen in puts und endet mit einem seg-Fehler. Wenn ich tokPtr = "1" mache; und das strtok() Zeug auskommentieren, ich laufe Valgrind und überhaupt keine Fehler. Ich habe keine Ahnung, warum das passiert und ich könnte wirklich Hilfe gebrauchen. Vielen Dank.

+0

Mein letzter Ausweg wäre, nur strtok() zu wiederholen und die Zeichenfolge mit dem ersten Teil einfach abgehackt zurückzusetzen. –

+2

was ist 'str' ?? –

Antwort

3

hier:

while(tokPtr != NULL) { 
    tokPtr = strtok(NULL, " "); 
    puts(tokPtr); 

Sie, ob tokPtr == NULLnach prüft werden sollten Sie strtok() nennen, nicht vor. Wenn strtok() schließlich NULL zurückgibt, wie es schließlich wird, werden Sie immer NULL zu puts() mit diesem Code übergeben, und das gibt Ihnen Ihr Problem.

Sie können einfach neu anordnen und ändern:

char* tokPtr = strtok(expr, " "); 
while(tokPtr != NULL) { 
    puts(tokPtr); 
    push(tokens, tokPtr); 
    tokPtr = strtok(NULL, " "); 
} 

Denken Sie auch daran, dass strtok() die Zeichenfolge modifiziert mit es funktioniert und gibt interne Zeiger auf diese Zeichenfolge. Sie zeigen Ihre push() Funktion nicht an, aber wenn der Code sehr einfach ist und Ihr expr Array Ihren Stack immer überdauert, werden Sie wahrscheinlich Probleme haben, diese Zeiger darauf zu schieben. Es kann besser sein, malloc() Speicher für jeden Token und kopieren Sie, was strtok() zurück in es und dann drücken Sie diese.

+0

Okay, ich verstehe, danke für deine Hilfe, es hat gut funktioniert –

0

Ich weiß, dass dies bereits beantwortet ist, aber aus diesem Grund empfehle ich strtok in einem for() statt einer Weile() zu verwenden, da es natürlich einen Initialisierer, eine Testbedingung und einen Iterator hat. Zum Beispiel:

for(char* tokPtr = strtok(expr, " "); 
    tokPtr != NULL; 
    tokPtr = strtok(NULL, " ")) 
{ 
    puts(tokPtr); 
    push(tokens, tokPtr); 
} 
+0

Danke, das ist eigentlich ein wirklich nützliches Beispiel –