Unerwartete Werte beim Ausgeben eines Arrays
-
Hallo,
ich bin neu hier im Forum und habe folgendes Problem:Das Programm soll den Wert, der vor dem ersten x steht, ausgeben.
Das Problem ist, dass mein Programm zwar den Wert ausgibt, aber noch mehr
Zeichen hintendran hängt.#include <iostream> #include <cstdio> using namespace std; int main() { char gleichung[] = "2x + 7x + 5"; char*ax; int anzahl=0; for(int i=0;gleichung[i] != 'x';i++) { anzahl += 1; } ax = new char[anzahl]; for(int i=0;i<anzahl;i++) { ax[i] = gleichung[i]; } cout << gleichung << endl; cout << ax << endl; fflush(stdin); getchar(); delete [] ax; return 0; }Meine Frage also:
Wo kommen die zusätzlichen Zeichen her?Viele Grüße
Sagara
-
Der Puffer, auf welchen ax zeigt, hat keine Nullterminierung. Daher hast du undefiniertes Verhalten. Wahrscheinlich wird einfach über die Puffergrenze hinaus gelesen, bis das erste Nullbyte gefunden wird.
Grüssli
-
Danke für die schnelle Antwort.
Aber so ganz funktionieren will das immer noch nicht.
Mache ich das so richtig mit der Nullterminierung?int anzahl=0; for(int i=0;gleichung[i] != 'x';i++) { anzahl += 1; } ax = new char[anzahl]; for(int i=0;i<anzahl;i++) { ax[i] = gleichung[i]; } ax[sizeof(ax)] = '\0';Außerdem bekomme ich jetzt eine Fehlermeldung, die auf eine Beschädigung des Heaps zurückzuführen sein könnte.

-
Sagara schrieb:
Mache ich das so richtig mit der Nullterminierung?
Nein, was ja auch die Fehlermeldung schon andeutet

sizeof(ax)gibt dir nicht die Puffergrösse zurück.axist nur ein Zeiger, daher gibtsizeof(ax)die Grösse eines Zeigers zurück. Auf einem 32 Bit System wäre das ein Wert von 4. Wenn man deinen Code anschaut, dann weiss man bereits, dass dies ausserhalb des Puffers ist und du schreibst somit in Speicher, welcher dir nicht gehört. Zudem hast du gar keinen Platz im Puffer reserviert für die Nullterminierung.// ... ax = new char[anzahl + 1]; // ^^^ Wir brauchen eine Stelle mehr. for(int i = 0; i < anzahl; i++) { ax[i] = gleichung[i]; } ax[anzahl] = '\0'; // Und schreiben dann die Nullterminierung an die letzte Stelle. // ...Grüssli
PS: Dir ist schon bewusst, dass es Dinge wie
std::stringgibt, welche solche Arbeiten extrem vereinfachen?
-
Sagara schrieb:
char gleichung[] = "2x + 7x + 5"; int anzahl=0; for(int i=0;gleichung[i] != 'x';i++) { anzahl += 1; } ax = new char[anzahl]; for(int i=0;i<anzahl;i++) { ax[i] = gleichung[i]; } ax[sizeof(ax)] = '\0';Statt zu fragen, versuch doch mal zu verstehen was du da machst ...
du "reservierst" unter dem "namen"
axSpeicherplatz für anzahl characters.anzahlermittelst du aus der Position des ersten 'x' in deiner Formel ... also wird anzahl == 1 sein. Also reservierst du 1 Zeichen im array ax. Da kopierst du die 2 rein. Irgendwo dahinter packst du noch ne '\0' ... kein Wunder das dein Heap krepiert
Wenns geht spar dir die
char arrays,newunddelete. Nimmstd::stringdas ist einfacher. Google malstd::stringund schau dort nach, da gibt es Methoden um Strings zu zerlegen.
-
Vielen, vielen Dank!
Jetzt funktioniert es wie es sollte.
Ich weiß, dass es die Klasse String gibt, aber ich wollte mich ein bisschen mit char Arrays vertraut machen. Kann bestimmt nichts schaden.

Viele Grüße
Sagara