verwaltung von ip adressen C++



  • Bitte formatier´ deinen kompletten Quelltext. Du kannst im Editor den kompletten Quelltext mit der Maus markieren und über den </> Button formatieren.

    Am Besten machst du das gar nicht mit den Arrays, denn das Array ist eine sinnvolle Lösung ist Quark und zeigt, dass der Aufgabensteller selbst keine Ahnung von C++ hat.
    Zunächst solltest du dir Gedanken über eine sinnvolle Datenstruktur einer IPv4 Adresse machen. Das kann eine Struktur wie

    struct IPAddressV4
    {
       std::uint8_t Octet1 = 0;
       std::uint8_t Octet2 = 0;
       std::uint8_t Octet3 = 0;
       std::uint8_t Octet4 = 0;
       
       IPAddressV4() = default;
    };
    

    oder auch nur ein einfacher std::uint32_t sein, in dem jedes Byte ein Oktett der IPv4 Adresse repräsentiert. Diese Dinge kannst du dann in einen std::vector stecken. std::vector hat den Vorteil, dass er seine Größe automatisch anpasst.
    Außerdem würde ich die main Funktion in mehrere Funktionen aufbrechen:

    #include <iostream>
    #include <string>
    #include <vector>
    #include <cstdint>
    
    struct IPAddressV4
    {
       std::uint8_t Octet1 = 0;
       std::uint8_t Octet2 = 0;
       std::uint8_t Octet3 = 0;
       std::uint8_t Octet4 = 0;
    
       IPAddressV4() = default;
    };
    
    int choice()
    {
       std::cout 	<< "Bitte wählen Sie eine Aktion aus:\n"
    		<< "1) eine neue IP Adresse eingeben\n"
    		<< "2) eine IP Adresse löschen\n"
    		<< "3) Liste der IP Adressen ausgeben\n"
    		<< "0) Programm beenden\n";
       for( ;; )
       {
          std::cout << "Ihre Wahl: ";
          int input;
          std::cin >> input;
          if( std::cin && input < 4 )
          {
             return input;
          }
          else
          {
             // inputstreams sind etwas umständlich zu behandeln, wenn die Eingabedaten
             // nicht zum zu lesenden Datentyp passen. Die nächsten zwei Zeilen löschen alle Zeichen
             // bis zum nächsten Linefeed (effektiv die ganze Benutzereingabe)
             std::cin.clear();
             std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
          }
       }
    }
    
    void add_address( std::vector<IPAddressV4>& addresses )
    {
       // TO DO:
       // Adresse eingeben und dem Vektor hinzufügen
    }
    
    void remove_address( std::vector<IPAddressV4>& addresses )
    {
       // TO DO:
       // Index eingeben und entsprechendes Element aus dem Vektor entfernen
    }
    
    void list_addresses( std::vector<IPAddressV4>& addresses )
    {
       // TO DO:
       // Vektor durchlaufen und IP Adressen ausgeben
    }
    
    int main()
    {
       std::vector<IPAddressV4> addresses;
    
       for( int ch = choice();
            ch != 0;
    	ch = choice() )
       {
          if( ch == 0 )      add_address( addresses );
          else if( ch == 1 ) remove_address( addresses );
          else if( ch == 2 ) list_addresses( addresses );
       }
    }
    


  • @DocShoe sagte in verwaltung von ip adressen C++:

    struct IPAddressV4
    {
    std::uint8_t Octet1 = 0;
    std::uint8_t Octet2 = 0;
    std::uint8_t Octet3 = 0;
    std::uint8_t Octet4 = 0;

    IPAddressV4() = default;
    };

    Hm... Warum nicht mit Array? Variablennamen mit ...0, ...1, ...n schreien doch geradezu danach.

    struct IPAddressV4
    {
        std::uint8_t[4] octets;
    }
    


  • Oder so.
    Oder von mir aus auch

    struct IPAddressV4
    {
       std::array<std::uint8_t,4> Octets;
    };
    

    Nur halt kein

    int[100][3]
    

    deshalb schrub ich ja sinnvolle Datenstruktur, da kann sich jeder austoben.



  • @DocShoe sagte in verwaltung von ip adressen C++:

    struct IPAddressV4
    {
    std::uint8_t Octet1 = 0;

    Das uint8_t widerspricht aber der Aufgabe, den Wertebereich der Zahlen zu überprüfen.

    Angenommen, die Werte werden aus einer Datei eingelesen, dann kann immer noch ein Anwender daran rum pfuschen.

    Da ist eine Wertüberlauf immerhin eine Fehlererkennung.



  • This post is deleted!


  • Danke für eure Hilfe, das ist echt hilfreich



  • @wob sagte in verwaltung von ip adressen C++:

    In der Aufgabe steht nur "IP-Adresse", aber dann wird mit IPv4 weitergemacht. IPv6 solls nicht sein?

    Das weiß ich wirklich nicht es steht auch nirgends ob man auch IPv6 nutzen kann aber ich mache es mit IPv4



  • @Scrafter sagte in verwaltung von ip adressen C++:

    @wob sagte in verwaltung von ip adressen C++:

    In der Aufgabe steht nur "IP-Adresse", aber dann wird mit IPv4 weitergemacht. IPv6 solls nicht sein?

    Das weiß ich wirklich nicht es steht auch nirgends ob man auch IPv6 nutzen kann aber ich mache es mit IPv4

    Es ist eine Übungsaufgabe zur Lösungsfindung und Umgang mit Arrays.
    Da gibt es keinen praktischen Nutzen für 🤷♂



  • @wob sagte in verwaltung von ip adressen C++:

    auto re_ipv4 = std::regex(R"""((?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})...))""");

    while (std::getline(std::cin, s)) {
    if (std::regex_match(s, re_ipv4))

    Könntest du bitte kurz erklären was diese abschnitte bedeuten?



  • Solange eine Zeile per getline() von cin nach s gelesen werden kann
    prüfe ob die Regular Expression re_ipv4 auf s passt.

    Aber mit RegEx sollst Du es wahrscheinlich eh nicht machen.


Log in to reply