Ü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, dass save gleich gross bleibt. Vielleicht einen const - vector anlegen 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::vector hat ja einen []-Operator.

    Wenn du strcpy verwendest, solltest du eigentlich noch <cstring> einbinden. Hier ist es zwar nicht so wichtig, aber vielleicht solltest du zur sichereren Variante strncpy() greifen. Oder gleich zu std::copy() . Oder viel besser gar nicht mit char s rumfrickeln. 😉


Anmelden zum Antworten