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
oderstring
undpush_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...