Seite 1 von 1

Problem mit strtok

Verfasst: Mo Feb 06, 2012 11:15 am
von do6dm
Folgendes Programm funktioniert tadellos:

Code: Alles auswählen

int main(){
    char string[] = "Das ist das Haus vom Nikolaus.";
    char delimiter[] = "s ";
    char *ptr;
    
    ptr = strtok(string, delimiter);
    while(ptr != NULL) {
	printf("Abschnitt gefunden: %s\n", ptr);
	// naechsten Abschnitt erstellen
 	ptr = strtok(NULL, delimiter);
}


    system("PAUSE");
    return 0;
}
Warum funktioniert es nicht mehr, wenn ich statt: char string[] = "Das ist das Haus vom Nikolaus.";
char *string = "Das ist das Haus vom Nikolaus."; schreibe?

Re: Problem mit strtok

Verfasst: Mo Feb 06, 2012 11:48 am
von Xin
do6dm hat geschrieben:Warum funktioniert es nicht mehr, wenn ich statt: char string[] = "Das ist das Haus vom Nikolaus.";
char *string = "Das ist das Haus vom Nikolaus."; schreibe?
Weil "Das ist das Haus vom Nikolaus" ein konstantes (unveränderliches) Char-Array ist (char const []), das bei char string[] = ... kopiert wird.
Bei "char * string" wird der Zeiger auf das unveränderliche char-Array kopiert. Das Array ist aber ein (char const []), was als (char const *) akzeptiert wird, aber nicht als (char *). Auf Deutsch: Du kannst string, was ein Zeiger auf veränderliche chars ist keinen Zeiger auf unveränderliche Chars zuweisen.

Code: Alles auswählen

char const * string = "Das ist das Haus vom Nikolaus.";
Ansonsten bitte ich Dich folgendes zu lesen: http://www.proggen.org/doku.php?id=faq:frageformulieren

"Funktioniert nicht" funktioniert als Fehlerbeschreibung nur, wenn sich jemand findet, dem das Problem offensichtlich ist. Wenn Du die Fehlermeldung des Compilers nicht verstehst, kann sie aber demjenigen helfen, das Problem zu erkennen.

Re: Problem mit strtok

Verfasst: Mo Feb 06, 2012 11:56 am
von AnGaiNoR
Xin hat geschrieben: "Funktioniert nicht" funktioniert als Fehlerbeschreibung nur, wenn sich jemand findet, dem das Problem offensichtlich ist. Wenn Du die Fehlermeldung des Compilers nicht verstehst, kann sie aber demjenigen helfen, das Problem zu erkennen.
Das Schöne ist ja, dass der Compiler keine Fehlermeldung ausspuckt, da die Zuweisung aus Abwärtskompabilitätsgründen (schönes Wort) durchaus noch erlaubt ist. Einfach als const zu deklarieren geht selbstverständlich auch in die Hose, denn strtok braucht ja einen veränderlichen String.

Re: Problem mit strtok

Verfasst: Mo Feb 06, 2012 12:09 pm
von Xin
AnGaiNoR hat geschrieben:
Xin hat geschrieben: "Funktioniert nicht" funktioniert als Fehlerbeschreibung nur, wenn sich jemand findet, dem das Problem offensichtlich ist. Wenn Du die Fehlermeldung des Compilers nicht verstehst, kann sie aber demjenigen helfen, das Problem zu erkennen.
Das Schöne ist ja, dass der Compiler keine Fehlermeldung ausspuckt, da die Zuweisung aus Abwärtskompabilitätsgründen (schönes Wort) durchaus noch erlaubt ist.
Aktuelle GCCs werfen soweit ich weiß Fehlermeldungen.
Bei Visual Studio bin ich mir nicht 100%ig sicher.

Ein Programmabsturz wäre allerdings eine legitime Fehlermeldung, die man erwähnen könnte. ;->
AnGaiNoR hat geschrieben:Einfach als const zu deklarieren geht selbstverständlich auch in die Hose, denn strtok braucht ja einen veränderlichen String.
Tatsache: Ich habe es bei der Beschreibung von strtok() sogar explizit hingeschrieben, wegen der eingefügten Nullbytes... :-/

Dann wird nichts anderes übrig bleiben, als den String zu kopieren.

Re: Problem mit strtok

Verfasst: Mo Feb 06, 2012 12:14 pm
von AnGaiNoR
Xin hat geschrieben: Aktuelle GCCs werfen soweit ich weiß Fehlermeldungen.
Meiner nicht. ^^ (4.6.1)
Xin hat geschrieben:Dann wird nichts anderes übrig bleiben, als den String zu kopieren.
Oder eben - wie's im Quelltext schon steht - die Variante mit dem Array nehmen, dann funktioniert's nämlich einwandfrei.

Re: Problem mit strtok

Verfasst: Mo Feb 06, 2012 12:16 pm
von Xin
AnGaiNoR hat geschrieben:
Xin hat geschrieben: Aktuelle GCCs werfen soweit ich weiß Fehlermeldungen.
Meiner nicht. ^^ (4.6.1)
-Wall?
-pedantic?

Eben das, was man als akzeptabler Programmierer in der Grundausstattung anwirft?
AnGaiNoR hat geschrieben:
Xin hat geschrieben:Dann wird nichts anderes übrig bleiben, als den String zu kopieren.
Oder eben - wie's im Quelltext schon steht - die Variante mit dem Array nehmen, dann funktioniert's nämlich einwandfrei.
Hier wird das Array kopiert.

Re: Problem mit strtok

Verfasst: Mo Feb 06, 2012 12:59 pm
von do6dm
Danke euch!
Also ich hab Dev-C++ 4.9.9.2, der sagt nix.

Re: Problem mit strtok

Verfasst: Mo Feb 06, 2012 1:33 pm
von Bebu
Dev-Cpp? Besorg dir mal einen aktuellen Compiler, wird schon lange nicht mehr weiterentwickelt. Früher oder später wirst du damit Probleme bekommen.

Re: Problem mit strtok

Verfasst: Mo Feb 06, 2012 2:00 pm
von AnGaiNoR
Xin hat geschrieben: -Wall?
-pedantic?
Die Idee ist mir zum schnell mal Ausprobieren gar nicht gekommen, aber Du hast natürlich recht. ^^