Einzelne Daten aus einem Array wieder löschen...



  • Hi Leute.

    Also zuerst mal, ich bin echt noch C++ Anfänger und mach jetz meine Ausbildung zum Anwendungsentwickler. Und jetz hab ich ein kleines Problem:

    Ich bin grad dabei ein Programm zu schreiben bei dem man verschiedene Namen eingeben kann und dannach auch alle Namen die man eingegeben hat auslesen kann. Jetz soll aber ein dritter Menüpunkt hinzu kommen.Ich möchte einzelne Namen wieder löschen können. und zwar soll das Programm den User nur nach einer Nummer fragen, die er beim erneuten Ausgeben der Namen vor dem Löschen (zwecks übersicht) vor die einzelnen Namen schreibt.

    Meine Frage jetzt:

    Mit welchem Befehl kann ich dem Programm sagen das er eine bestimmte Position im Array löschen soll...

    Nur nochmal zur Verdeutlichung: Das setzten der Zahlen vor die Namen ist nicht das Problem. Es geht mir rein um das löschen selbst...

    Wär super wenn ihr mir helfen könntet!
    Hier nochmal der Code damit auch alle wissen wo welches Problem is: Case 3 is das Problem!

    #include <iostream.h>
    #include <string.h>
    
    int main ()
    
    {
    
    string str_name[6][2];
    int loop;
    char cback;
    
    do
    {
    //Menue------------------------------------------
         int menue;
    
         cout<<"Was wollen sie tun?"<<endl;
         cout<<"\nNamen Eingeben <1>";
         cout<<"\nNamen auslesen <2>"<<endl;
         cout<<"loeschen <3>"<<endl;
         cout<<"suchen <4>"<<endl;
         cout<<"Programm beenden <5>"<<endl;
         cin>>menue;
    
             switch(menue)
    
                {
    
                  case 1: for (loop = 0; loop <=5; ++loop)
                           {
                              cout<<"Bitte geben sie hier ihren Vornamen ein:\n";
                              cin>>str_name[loop][0];
                              cout<<"Bitte geben sie hier ihren Nachnamen ein:\n";
                              cin>>str_name[loop][1];
                              cout<<endl;
                              cout<<"Wollen sie zurueck ins Hauptmenue? <J/N>"<<endl;
                              cin>>cback;
    
                           if (cback == 'j' || cback == 'J')
                              break;
                           }
                          break;
    
                  case 2: cout<<"Folgende Namen wurden schon eingelesen: "<<endl;
    
                          for (loop = 0; loop <= 5; loop++)
                                cout<<str_name[loop][0] + ' ' + str_name[loop][1]<<'\n';
                                cout<<endl;
                          break;
    
                  case 3: cout<<"Welchen Namen wollen sie Löschen?"<<endl;
                          delete str_name[2][1]; /* Wenn ichs so mache bringt er  mir ne Fehlermeldung!*/
    
                  break;
    
                  case 4:
                  break;
    
                  case 5:
                  return 0;
    
                }
    
    }
    while (cback == 'J' || cback == 'j');
    
    return 0;
    
    }
    


  • statt
    delete str_name[2][1];
    str_name[2][1]="";



  • Danke Funtioniert!

    Und wenn ich beider Spalten aus dem Array löschen will?

    mit

    str_name[2][0,1]="";
    

    gehts net



  • delete ist dazu da, dass man Speicher wieder freigibt, den man mit new reserviert hat. Hier also komplett falsch.

    Arrays bieten so keine Möglichkeit ein Element zu löschen, dass liegt einfach an der gegebenen Struktur (Arrays sind eben einfach n*m Bytes aneinander gereiht). Wenn du löschen willst musst du umkopieren (siehe man: memcpy(3)) oder das Element als ungültig makieren.

    Vielleicht solltest du anstelle eines Arrays aber eher eine Verlinkte-Liste benutzen, damit kann man leicht auch innerhalb der Liste einfügen und löschen.



  • musst du einzeln oder in ner schleife machen //for ( int i = 0; i < 2; i++ ) ...

    in einer zeile gehts nur wenn du ne containerklasse verwendest wie z.b. std::vector oder std::deque

    @kingruedi ich glaub dafür is er noch zu grün hinter den ohrn 😉



  • Danke für die schnellen antworten!

    Ich Programmier momentan noch mit meinem (noch) sehr kleinen wissen...
    Von listen hab ich noch nix gehört *g*

    Aber mittlerweilen komm ich meinem Ziel wenigstens näher! Danke



  • Ok!
    Das funktioniert jetz! Bin zwar sicher dasses einfacher geht aber soweit so gut!

    Ein Problem (haha) hab ich jetz aber noch... Und zwar macht er mir jetz an der stelle wo früher der Name Stand logischerweiße eine Leerzeile! Gibts ne möglichkeit die werg zu bekommen?



  • for (loop = 0; loop <= 5; loop++)
    {
      if ( str_name[loop][0].is_empty() && str_name[loop][1].is_empty() )
        continue;
    
      cout<<str_name[loop][0] + ' ' + str_name[loop][1]<<'\n';
    }
    cout<<endl;
    break;
    

    ps: bind grad ned sicher obs .empty() oder .is_empty() heisst
    probier mal aus



  • du kannst ja einfach vor dem ausgeben prüfen ob der String gleich "" ist.



  • @sovok:

    da prüf ich doch nur ob sie leer ist oder? Der compiler bringt mir dann beim auslesen übrigens nen fehler!

    Edit: is übrigens nur .empty



  • Hat sich erledigt! Habs schon!
    Hab schon wieder ein neues Problem, aber ich setz mich erstmal selber dran! Ich meld mich später *g*


Anmelden zum Antworten