Problem mit char pointern
-
Ich schreibe der zeit an einem Programm das einen Staz in Teilsätze aufteile. Dazu benutze ich zwei Klassen sentence und subSentence. bei sentence ist der operator= mit einem char pointer überladen. also kann ich hier einfach einen char pointer zuweisen. dieser wird dann analysiert. trifft die funktion auf ein komma, wird der satz von dem letzt komma oder satzanfang bis zu diesem komma kopiert. das alles funktioniert auch. wenn ich die teilsätze dann acuh ausgebe kommt hinter den zweiten ein hochgestelltes L und "3D". Wenn ich jedoch davor eine Zahl ausgebe wir dieses nicht angezeigt. Hier der Quellcode:
int numChar = lengthOfPChar(sent); for(int i,j = 0; i <= numChar; i++) { char c = sent[i]; if(c == ',') { int numNChar = i - j; cout<<"numNChar"<<numNChar<<endl;//Wenn das hier //auskommentiert ist wird das L3D angezeigt wenn nicht //wird es nicht angezeigt char newSent[numNChar]; for(int k = 0; k <= numNChar; k++) { cout<<"k"<<k<<endl; cout<<"j"<<j<<endl; newSent[k] = sent[j]; cout<<"ck"<<newSent[k]<<endl; cout<<"cj"<<sent[j]<<endl; j++; } cout<<newSent<<endl; j = i + 1; myNumSubSent++; } }Edit: es ist nicht immer das L3D sondenr je nach eingabe etwas anderes, aber es erscheint nur wenn das obige Codeteil auskommentiert ist.
-
Ohne den Rest angeschaut zu haben, du hast an einigen Stellen sowas: i <= numChar, mach da mal < draus.
-
also das zweite <= ist damit das komma mitgenommen wird. das erste weiss ich nicht genau jedenfalls passiert nichts wenn man es zu einem < macht. es nimmt jedenfalls die nullterminierung mit.
-
tweenki schrieb:
also das zweite <= ist damit das komma mitgenommen wird.
Dann mach das Array größer. Der letzte erlaubte Index für newSent ist numNChar-1.
-
Außerdem ist i in der Schleife nicht initialisiert. int i = 0, j = 0;
-
Und pack zu int numNChar = i - j; noch ein + 1, damit du hinter der Schleife newSent[numNChar-1] = 0; setzen kannst. Denn sonst fehlt in dem String die terminierende Null. Und die <= alle durch < ersetzen.
Dann fehlt auch noch am Ende die Ausgabe des Reststrings.
-
ja durch das komma wäre ein pufferüberlauf passiert. ich habs jetzt immer eins größer. das mit dem int i = 0, j = 0; hab ich auch gemacht aber hat auch nichts gebracht.
Es muss irgendetwas mit diesem numNChar zu tun haben, wenn ich es ausgebe stimmt alles wenn ich es nicht ausgebe, wird nach dem komma immer noch ein buchstabe ausgegeben.
-
Es war die Null-Terminierung.
int numChar = lengthOfPChar(sent); for(int i = 0,j = 0; i <= numChar; i++) { char c = sent[i]; if(c == ',') { int numNChar = i - j; //cout<<"numNChar"<<numNChar<<endl; char newSent[numNChar+2]; cout<<sizeof(newSent)<<endl; for(int k = 0; k <= numNChar; k++) { cout<<"k"<<k<<endl; cout<<"j"<<j<<endl; newSent[k] = sent[j]; cout<<"ck"<<newSent[k]<<endl; cout<<"cj"<<sent[j]<<endl; j++; } newSent[sizeof(newSent)-1] = '\0'; cout<<newSent<<endl; cout<<sizeof(newSent)<<endl; j = i + 1; myNumSubSent++; } }so sieht der Code jetzt aus.
Danke

-
Nein, das Problem ist das du stumpf über Array-Grenzen hinweg arbeitest, das du in das neue Char-Array zwar die richtigen Buchstaben schreibst, dann aber die terminierende Null vergißt...
Folgendes funzt nämlich:
int myNumSubSent = 0; int numChar = strlen(sent); int j = 0; for(int i = 0; i < numChar; i++){ char c = sent[i]; if(c == ','){ int numNChar = i - j + 1; char newSent[numNChar]; for(int k = 0; k < numNChar - 1; k++){ newSent[k] = sent[j]; j++; } newSent[numNChar-1] = 0; cout << newSent << endl; j = i + 1; myNumSubSent++; } } cout << &sent[j] << endl;