Übung C++ Primer 4.34
-
Schreiben Sie ein Programm, das Strings in einen Vektor einliest.
Kopieren Sie diesen Vektor in ein Array mit Zeichenzeigern. Weisen Sie für jedes Vektorelement ein neues Zeichenarray zu, in das Sie die Daten des Elements kopieren. Fügend Sie in das Array mit Zeichenzeiger einen Zeiger auf
das Zeichenarray ein.Hier meine Umsetzung. (1. Problem: Ich weiß nicht mal ob ich die - meiner Meinung nach äußerst konfuse Fragestellung - richtig verstanden habe.)
#include <iostream> #include <string> #include <vector> using namespace std; int main() { string temp; vector<string> save; while(getline(cin, temp) and temp != "-1") { save.push_back(temp); } char **p = new char * [save.size()]; size_t i = 0; for(vector<string>::iterator iter = save.begin(); iter != save.end(); ++i,++iter) { p[i] = new char[(*iter).size() + 1]; strcpy(p[i],(*iter).c_str()); } for(size_t i = 0; i < save.size(); ++i) { cout << (p[i]) << endl; } //Große DELETE Phase //Wird hier korrekt gelöscht? for(size_t i = 0; i<save.size(); ++i) { delete []p[i]; } delete []p; return 0; }Eure Meinung? Wie hättet ihr das gemacht? Klappt da in meinem Zeiger "Wirr-Warr" alles?
Ich bin halt davon ausgegangen, dass ich nicht weiß, wieviele Strings der Bentzer eingibt, sonst wäre es ja um einiges einfacher gewesen.MfG
Stromberg
-
Keiner lust mich zu verbessern?
MfG
Stromberg
-
Stromberg schrieb:
Keiner lust mich zu verbessern?
Du musst verstehen, dass wir nicht immer Lust haben, deine Aufgaben zu korrigieren.

Aber ich bin jetzt mal nicht so. Im Grossen und Ganzen sollte dein Code so stimmen, mir ist kein Fehler aufgefallen. Auch wird der Speicher ordnungsgemäss freigegeben, nämlich
save.size()mal die C-Strings und dann noch das ganze Array. Du musst einfach schauen, dasssavegleich gross bleibt. Vielleicht einenconst-vectoranlegen und mit dem Rückgabewert einer Funktion initialisieren.Gewisse Dinge könntest du einfacher machen. Zum Beispiel brauchst du in der Kopierschleife keine Iteratoren, nimm doch einfach den Index.
std::vectorhat ja einen []-Operator.Wenn du
strcpyverwendest, solltest du eigentlich noch<cstring>einbinden. Hier ist es zwar nicht so wichtig, aber vielleicht solltest du zur sichereren Variantestrncpy()greifen. Oder gleich zustd::copy(). Oder viel besser gar nicht mitchars rumfrickeln.