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


  • Administrator

    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. 😕


  • Administrator

    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. ax ist nur ein Zeiger, daher gibt sizeof(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::string gibt, 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" ax Speicherplatz für anzahl characters. anzahl ermittelst 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 , new und delete . Nimm std::string das ist einfacher. Google mal std::string und 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


Anmelden zum Antworten