[c++]segfault beim trennen von zwei strings

SOURCEry

Grünschnabel
Huhu,

ich hoffe ihr könnt etwas mit der Problembeschreibung anfangen: In einem Teil meines "Programms" entsteht ein Speicherzugriffsfehler und ich bin nicht in der Lage den Grund zu finden.

Code:
/*Hier beginnt der Trainingsmodus, Vokabeln der Fremdsprache werden aus der Datei text.txt ausgelesen,
     nun soll der Benutzer einen string eingeben, mit dem dann die Übersetzung der Vokabel verglichen wird!*/
    if(mode==3){
	char *p1, *p2;
        fstream f("text.txt");
	char* dummy=new char[1024];
	char* voc=new char[512];
	
	while(!f.eof()) {
	f.getline(dummy, 1024);
	p1=dummy;
	p2=strchr(p1, '|');
	*p2++ = '\0';
	cout << p1 << " heisst uebersetzt!?" << endl;
	cin >> voc;

	if(strcmp(p2,voc)!=0){
		cout << "NEIN DU TROTTEL! " << p1 << " bedeutet " << p2 << " uebersetzt!" << endl;
	}
	else { cout << "RICHTIG! Gut gemacht!" << endl;
	}
	}
    }

Der Fehler tritt auf nachdem die Schleife abgearbeitet wurde, ob ich jetzt den Speicher auf dem Heap wieder freigebe hat keinen Unterschied gemacht, habe das also mal weggelassen damit man den Fehler schneller findet.
Vielleicht hätte ich den Fehler schon gefunden wenn ich meinen ddd ans laufen bekäme...sorry mehr hab ich nicht drauf, bin absoluter newbie was c++ und den ddd angeht. ^^



liebe Grüße,

SOURCEry
 
Hi,

So wie ich das sehe liegt der Fehler wohl in dieser Zeile:
Code:
*p2++ = '\0';

Muss man diese 0 überhaupt manuell anhängen?

Jedenfalls stürzt das programm bei mir nichtmehr dierekt ab wenn ich es starte, solange ich diese Zeile auskommentiere.

Ich hoffe das hat dir etwas weitergeholfen.

mfg g4mmler
 
Hi!

Code:
*p2++ = '\0';
An dieser stelle erhöhst du den Wert der in p2 steht!
Was du aber wahrscheinlich machen willst ist

Code:
*p2 = '\0';
p2++;

Benny
 
Hi,

So wie ich das sehe liegt der Fehler wohl in dieser Zeile:
Code:
*p2++ = '\0';

Muss man diese 0 überhaupt manuell anhängen?

Jedenfalls stürzt das programm bei mir nichtmehr dierekt ab wenn ich es starte, solange ich diese Zeile auskommentiere.

Ich hoffe das hat dir etwas weitergeholfen.

mfg g4mmler

Hauptregel des erfolgreichen Debuggens: Man beseitigt keien Fehler indem man blind Zeilen auskommentiert bis das Programm nciht mehr abstürzt. Ein Fehler ist nur, und wirklich nur dann beseitigt wenn man ihn eklären kann und _dann__ gezielt fixed.

1. 0 wird hier nicht angehangen, sondern as Zeichen '|' wird durch 0 ersetzt um so die Zeichenkette in 2 Zeichenketten zu zerlegen (1tes und 2tes Wort)

2. Der Fehler liegt darin, daß f.getline() aufgerufen wird und nicht geprüft wird, ob denn auch wirklich eine Zeile geladen wurde. Mit an Sicherheit grenzender Wahrscheinlichkeit hat text.txt am Ende eine Leerzeile. p2=strchr(p1, '|'); liefert dann eine 0 zurück, weil in der Leerzeile kein '|' gefunden werden kann. In der nächsten Zeile kommt dann ein null-pointer-Zugriff. (aka Speicherzugriffsfehler),

Code:
   if( p2=strchr(p1, '|') ) {
      *p2++ = '\0';
       usw...
   }

Eine kleine if-Abfrage soltle das Problem beseitigen.



Hi!

Code:
*p2++ = '\0';
An dieser stelle erhöhst du den Wert der in p2 steht!
Was du aber wahrscheinlich machen willst ist

Code:
*p2 = '\0';
p2++;

Benny

Das tut weh... Sechs, setzen, das war absolut falsch Benny...

Code:
*p2 = '\0';
p2++;

ist genau das gleiche wie

Code:
*p2++ = '\0';

In beiden Fällen wird dem Inhalt des Zeigers der Wert '\0' zugewiesen, danach wird der Zeiger incrementiert. Die Aussage könnte also kaum falscher sein...

um den INHALT des Zeigers zu incrementieren müßte man schreiben

Code:
(*p2)++
 
Zurück