Brauche Hile bei STRTOK
-
Hallo, wollte einen String mit der Funktion strok zerlegen, und die einzeln gefunden Wörter in einen "binären Baum" eintragen und sortieren. Das zerlegen des Strings funktioniert aber nicht. Die Ausgabe des kompltten Strings funktioniert, kann ihn aber nicht zerlegen, das Prog stürzt ab, kann mir jemand sagen, was ich falsch mache. Die Sache mit der Struktur habe ich deshalb so gewählt, weil ich nich mit Static-Variablen arbeiten wollte. Hier der Code:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char *String; char *ActP; } Words; char* getword(Words *); int main(void) { Words Data; Data.ActP = NULL; Data.String = "now is the time for all good men to come to the aid of their party"; int count = 0; printf("[MAIN] String lautet: %s\n", Data.String); while(Data.ActP = getword(&Data)) { count++; printf("Neues Wort gefunden %d\n", count); } return 0; } char * getword(Words *TmpData) { printf("[GETWORD] Kompletter String lautet: %s\n", TmpData->String); if (!TmpData->ActP) { TmpData->ActP = strtok(TmpData->String, "\n\t "); } else { TmpData->ActP = strtok(NULL, "\n\t "); printf("Im ELSE\n"); } return TmpData->ActP; }
Vielen Dank und FROHES FEST
-
strtok setzt nullen in den string, d.h. du darfst keine stringkonstante übergeben.
nicht so:Data.String = "blah blah ... usw";
sondern z.b. so:
char str[] = "blah blah ... usw"; Data.String = str;
^^ brauchst also ein array o.ä speicher der beschrieben werden kann.
-
Ich weiß nicht, was Du willst, aber geht
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char String[1000]; char *ActP; } Words; char* getword(Words *); int main(void) { Words Data; Data.ActP = NULL; strcpy(Data.String,"now is the time for all good men to come to the aid of their party"); int count = 0; printf("[MAIN] String lautet: %s\n", Data.String); while(Data.ActP = getword(&Data)) { count++; printf("Neues Wort gefunden %d\n", count); } return 0; } char * getword(Words *TmpData) { printf("[GETWORD] Kompletter String lautet: %s\n", TmpData->String); if (!TmpData->ActP) { TmpData->ActP = strtok(TmpData->String, "\n\t "); } else { TmpData->ActP = strtok(NULL, "\n\t "); printf("Im ELSE\n"); } return TmpData->ActP; }
?
Wenn ja, dann liegts nur dran, daß Du strtok nicht auf stringliterale anwenden darfst, weil sie im ROM liegen (dürfen).
-
Vielen Dank für eure Antworten, hat geklappt, jetzt kann ich versuchen einen Baum aufzubauen.
-
Hab trotzdem nich ne Frage:
Bin gerade dabei mit binären Bäumen zu arbeiten, hab bei Galileo Computing in dem entsprechenden Kapitel folgendes Listeing gefunden:/* strtok.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char string[] = "Ein Teststring mit mehreren Worten\n" "und mehreren Zeilen.\t Ende\n"; int i=1; char *ptr; ptr = strtok(string, "\n\t "); while(ptr != NULL) { printf("% d. Wort: %s\n",i++,ptr); ptr = strtok(NULL, "\n\t "); } return EXIT_SUCCESS; }
Frage ist nun, was ist an diesem String anders/besser als an meinem, wo ich den Fehler hatte, für mich sind die irgendwie gleich.
-
Hallo,
die Art der "Speicherung" der Strings unterscheidet sich hier, die beiden Strings liegen in jeweils anderen Speicher/Code-Segmenten, einmal in einem, das schreiben und lesen erlaubt, das andere Mal in einem, das nur lesen erlaubt. Und strtok will eben unbedingt in den Speicherbereich des Strings schreiben, was eben nicht geht, weil der Compiler hier:
Data.String = "now is the time for all good men to come to the aid of their party";
die Zeichendaten in einem Nur-Lesebereich platzieren darf (das ist aber so gut wie bei allen Compilern der Fall), aber hier:
char string[] = "Ein Teststring mit mehreren Worten\n" "und mehreren Zeilen.\t Ende\n";
die Zeichen auf jeden Fall in einem Speicherbereich unterbringt, der auch beschreibbar ist. Die Verwendung der eckigen Klammern ([]) sorgt hier dafür, dass das, was rechts vom =-Zeichen steht, in einem anderen Speichersegment liegt. Also: obwohl auf der rechten Seite die gleiche Schreibweise erlaubt ist, bestimmt doch die linke Seite (die Art der Deklaration, der Variablen-Typ), wo die Daten stehen, auf die der/die Typ/Variable verweist.
MfG,
Probe-Nutzer
-
Vielen Dank für die Antworten