strtok()
-
Folgender Code:
void foo(char *str) { printf("%s",strtok(str,":")); } /* (1) */ char str[] = "Albert:Einstein"; foo(str); /* (2) */ foo("Alan:Turing");
Bei (1) wird erwartungsgemäß Albert ausgegeben, bei (2) stürtzt das Programm ab.
Warum?
-
Ich denke es liegt daran, dass du ein String-Literal übergibst und keinen Zeiger. So würde es gehen:
#include <stdio.h> #include <string.h> void foo(char *str) { char *word; printf("%s\n",strtok(str,":")); } int main() { char str[] = "Albert:Einstein"; foo(str); strcpy(str, "test:versuch"); foo(str); return 0; }
BTW: Außerdem ist strtok veraltet.....
-
was waere die neuere/bessere Variante zu strtok?
-
Berichtigung....
Ich hatte jetzt C++ im Kopf. Natürlich kann man das auch dort benutzen, es ist aber nicht unbedingt emfehlenswert, zumal es dort Alternativen gibt (z. B. getline). In C kenne ich keine Alternative...
-
CarstenJ schrieb:
Natürlich kann man das auch dort benutzen, es ist aber nicht unbedingt emfehlenswert, zumal es dort Alternativen gibt (z. B. getline).
getline -> fgets
und was würdest du statt strtok verwenden? Ausser einen selber geschriebenen Token-Iterator?
-
In etwa so...
int main() { stringstream wort; wort << "in:etwa:so" << endl; string blah; getline (wort, blah, ':'); cout << blah; }
-
CarstenJ schrieb:
Ich denke es liegt daran, dass du ein String-Literal übergibst und keinen Zeiger.
Soweit war ich auch schon
Aber warum darf man das nicht? Ich übergebe doch
einen Pointer auf das String-Literal, warum kann strtok nicht damit arbeiten?
-
Du übergibts praktisch einen const char*, obwohl strtok einen char* erwartet.
-
Danke!
-
strtok ist doch immer noch aktuell? Hat eben nur Probleme wegen der Thread Sicherheit. Deswegen gibt es unter POSIX noch die Funktion strtok_r, die auf einem selbst übergebenen Buffer arbeitet.
-
Wie gesagt, hatte mich ja schon korrigiert......
-
kingruedi schrieb:
strtok ist doch immer noch aktuell?
Mir war die Funktion immer schon suspekt...