array zur laufzeit vergrößern?



  • Hi Leute!

    Ich möchte ein char-Array dynamisch zur Laufzeit vergrößern. Mein erster Ansatz war der hier:

    #include<iostream>
    using namespace std;
    
    int main()
    {
    	char zeichen;
    	int i = 0;
    
    	cout << "Gewünschten String eingeben: ";
    
    	cin >> zeichen;
    	while(zeichen != 45)
    	{
    		cin >> zeichen;
    		char* feld = new char[i];
    		feld[i] = zeichen;
    		i = i + 1;
    	}
    
    return 0;
    }
    

    Es lässt sich zwar kompilieren und auch ausführen, aber funktionieren tut's trotzdem nicht so wie ich will...

    Könnt ihr mir helfen wo der Fehler ist?



  • #include<iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	string Text;
    	char zeichen;
    
    	cout << "Gewünschten String eingeben: ";
    
    	cin >> zeichen;
    	while ( zeichen != 45 )
    	{
    		cin >> zeichen;
    		Text.push_back( zeichen );
    	}
    
    	return 0;
    }
    

    Oder alternativ:

    #include <string>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	string Text;
    	getline( Text, '-' );
    }
    

    Als dynamisch wachsenden Array-Ersatz nimmt man in der Regel std::vector. Bei Zeichenketten std::string.



  • Sorry, zweite Version sollte so sein:

    #include <string>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        string Text;
        getline( cin, Text, '-' );
    }
    

    Für die Funktion getline siehe hier.



  • Warum es nicht funktioniert: Die Anweisung char* feld = new char[i]; legt ein neues Feld an und vergößert nicht das alte. Du legst also im ersten Schleifendurchlauf ein Feld der Länge 0 an und beschreibst dessen nicht vorhandenes erstes Element (undefiniert, nur durch glückliche Umstände gibt das keine Zugrifssverletzung). Im nächsten Schleifendurchlauf legst du ein neues Feld der Länge 1 an. Damit hast du zum einen das andere Feld der Länge 0 nicht frei gegeben, noch taucht das nicht vorhandene erste Element des Feldes der Länge 0 magisch im Feld der Länge 1 auf, von dem du dann undefinierterweise das zweite Element überschreibst. Und so weiter.

    Lösung, ganz einfach: benutze vector oder string und push_back und alle deine Probleme sind gelöst.



  • Wohl besser ein vector<char>, da strings immutable sind, wodurch ständig neue Objekte erzeugt werden.
    Kommt halt draufan wie oft du die Grösse ändern möchtest.



  • icarus2 schrieb:

    Wohl besser ein vector<char>, da strings immutable sind, wodurch ständig neue Objekte erzeugt werden.

    Nein, sind sie bei C++ nicht - Strings können genauso manipuliert werden wie vector<> (und verwenden wohl meistens eine vergleichbare Speicherstrategie).



  • CStoll schrieb:

    icarus2 schrieb:

    Wohl besser ein vector<char>, da strings immutable sind, wodurch ständig neue Objekte erzeugt werden.

    Nein, sind sie bei C++ nicht - Strings können genauso manipuliert werden wie vector<> (und verwenden wohl meistens eine vergleichbare Speicherstrategie).

    😮
    Wusste ich nicht. Naja, dann hab ich ja mal wieder was gelernt.



  • CStoll schrieb:

    (und verwenden wohl meistens eine vergleichbare Speicherstrategie)

    Jedoch deutet Stroustrup im "Die C++-Programmiersprache" relativ spezielle Konzepte an...


Log in to reply