Ausgabe aller IP-Adressen



  • @hustbaer sagte in Ausgabe aller IP-Adressen:

    Wenn die IP Adressen weder geparsed noch validiert werden müssen, und es immer genau 3 sind, dann ist das sogar sehr einfach: 3 Strings einlesen und wieder ausgeben. Ferdich.

    Ich habe so eine Vorprogramm gemacht
    Könnte man so sagen:

       #include <regex>
       #include <iostream>
       #include <string>
       #include <array>
    
    using namespace std;
    
    
      int main() {
    
    auto re_ipv4 = std::regex(R"""((?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})))""");
    
       cout << " \n\n Verwaltung von IP-Adressen \n\n";
    
    std::cout << "Bitte IP-Adresse eingeben:\n";
    
    string s;
    
    while (std::getline(std::cin, s)) {
        if (std::regex_match(s, re_ipv4))
            cout << "Ihre IP-Adresse wurde Ueberprueft\n" << "Ihre IP-Adresse ist Gueltig\n";
        else
            cout << "Ihre IP-Adresse ist Ungueltig\n";
        cout << "Eine weitere IP-Adresse eingeben\n";
        break;
    
    }
    
    {
        auto re_ipv4 = std::regex(R"""((?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})))""");
    
        string s;
    
        while (std::getline(std::cin, s)) {
            if (std::regex_match(s, re_ipv4))
                cout << "Ihre IP-Adresse wurde Ueberprueft\n" << "Ihre IP-Adresse ist Gueltig\n" << "Eine weitere IP-Adresse eingeben\n";
            else
                cout << "Ihre IP-Adresse ist Ungueltig\n";
            break;
    
        }
    }
    
    {
        auto re_ipv4 = std::regex(R"""((?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})))""");
    
        string s;
    
        while (std::getline(std::cin, s)) {
            if (std::regex_match(s, re_ipv4))
                cout << "Ihre IP-Adresse wurde Ueberprueft\n" << "Ihre IP-Adresse ist Gueltig\n";
            else
                cout << "Ihre IP-Adresse ist Ungueltig\n";
            break;
    
        }
    }
    
    
    cout << "Das Programm ist abgeschlossen.\n";
    return 0;
    
      }
    

    und ich will halt dass am ende die Eingegeben Ip adressen angezeigt werden



  • @Scrafter sagte in Ausgabe aller IP-Adressen:

    Ich habe so eine Vorprogramm gemacht

    Ne, Du hast Code zusammenkopiert ohne zu kapieren. (https://www.c-plusplus.net/forum/post/2603559)



  • @Swordfish Ja ich habe das kopiert und zusammen getan aber ich verstehe schon was da passiert



  • @Scrafter sagte in Ausgabe aller IP-Adressen:

    ich verstehe schon was da passiert

    Aha. Ja. Is klar. Deswegen kopierst Du einen Block Code dreimal so hintereinander obwohl egal ist ob der dreimal hintereinandersteht oder nicht (und trotzdem das gleiche Verhalten dabei rauskommt).

    Und weil du ja so den Durchblick hast werden re_ipv4 und s sinnlos immer und immer wieder deklariert/definiert. 👍



  • @Swordfish Das ist doch egal ob es 3 mal oder 5 mal geschrieben wird Hauptsache der Prüft es 3 mal



  • @Scrafter sagte in Ausgabe aller IP-Adressen:

    Hauptsache der Prüft es 3 mal

    Mhm. Wann bricht denn

    while (std::getline(std::cin, s))
    

    ab?



  • @Scrafter sagte in Ausgabe aller IP-Adressen:

    Ich habe so eine Vorprogramm gemacht

    Ah ja. MEIN Programm. Deins, meins, egal. Ich habe noch extra dazugeschrieben, dass das wohl nicht der Weg ist, der erwartet würde.

    Wenn du es wirklich verstehst, kannst du es natürlich gerne verwenden. Aber ist die klar, was in Zeile 11 passiert?



  • @Swordfish sagte in Ausgabe aller IP-Adressen:

    Mhm. Wann bricht denn
    while (std::getline(std::cin, s))

    ab?

    irrelevant, da @Scrafter da ein break reingebaut hat (man fragt sich dann natürlich, wozu das while noch gut ist).



  • @wob sagte in Ausgabe aller IP-Adressen:

    irrelevant, da @Scrafter da ein break reingebaut hat

    Ja, schon. Er sollte sich das trotzdem fragen.



  • @wob Sorry habe falsch formuliert



  • @Scrafter sagte in Ausgabe aller IP-Adressen:

    Wenn Ja könnt ihr mir kurz sagen wie es gehen würde

    #include <cstdlib>
    #include <regex>
    #include <iostream>
    #include <string>
    #include <array>
    
    int main()
    {
        auto re_ipv4{ std::regex(R"""((?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})))""") };
        std::array<std::string, 3> ip_addresses;
        
        std::cout << "Geben Sie " << std::size(ip_addresses) << " IPv4 - Adressen ein:\n";
        for (std::size_t i = 0; i < std::size(ip_addresses); ++i) {
            std::cout << i + 1 << ": ";
            std::string s;
            if (!std::getline(std::cin, s)) {
                std::cerr << "Allgemeiner Lesefehler.\nbye.\n\n";
                return EXIT_FAILURE;
            }
            if (!std::regex_match(s, re_ipv4)) {
                std::cerr << "Ungueltige Adresse :(\n";
                --i;            
            } else ip_addresses[i] = s;        
        }
    
        std::cout << "Ihre eingegebenen IPv4-Adressen:\n";
        for (std::size_t i = 0; i < std::size(ip_addresses); ++i)
            std::cout << i + 1 << ": " << ip_addresses[i] << '\n';
    }
    


  • Lieber @Scrafter: was ist dein Level - was ist der Erwartungshorizont und was hast du schon gelernt? Es ergibt ja wenig Sinn, hier eine Lösung zu nutzen, die du gar nicht verwenden sollst.

    Du kannst auch einfach mit cin >> zahl eine Zahl lesen, dann mit cin.get(c) ein einzelnes Zeichen einlesen und prüfen ob es ein '.' ist (und natürlich immer die Rückgabe checken), dann wieder eine Zahl usw. Ich könnte mir vorstellen, dass das so gewünscht ist.



  • @wob Ich mache das C++ in der Schule und die sachen werden schlecht erklärt und ja deswegen weiß ich nicht so viel



  • @Scrafter ok. Am besten vergiss meine Lösung mit dem regulären Ausdruck. Die war wirklich eher als Spaß gemeint. Geht zwar. Aber ich glaube, das Problem sollte man anders angehen.

    Oben steht nur "lies 3 Adressen ein und gib 3 Adressen aus". Mit dem regulären Ausdruck habe ich die Aufgabe "Überprüfe, dass ein String die Form einer gültigen IP-Adresse hat" gelöst.

    Wir können auch nicht raten, was du nun wirklich machen sollst. Am besten fragst du hier nicht nach Lösungen für eine Aufgabe oder unspezifisch nach hilfe, sondern am besten fängst du selbst an. Erstmal überlegen, was die Aufgabe denn wirklich ist. Sei dabei sehr genau. Sie besteht bestimmt aus mehreren unterschiedlichen Dingen. Überleg dir, ob du kleine Teile davon schon umsetzen kannst. Dann schreib diese erstmal. Stelle KONKRETE Fragen gerne hier (aber nicht: "kann mir wer helfen", denn darauf ist die Antwort "ja, es kann dir jemand helfen, aber ob der/diejenige Lust hat, weiß ich nicht"). Dann mach mit dem nächsten Schritt weiter.

    Du hast vielleicht:

    • einlesen mehrerer "Adressen" als String
    • überprüfen, ob eingegebene Adresse eine IP-Adresse ist
    • ...


  • @wob sagte in Ausgabe aller IP-Adressen:

    einlesen mehrerer "Adressen" als String

    So schwer würde ich es mir garnicht machen.

    struct ipv4_t { char unsigned part[4]; };
    
    bool read_ip(std::istream &is, ipv4_t &ipv4)
    {
        for (int i = 0; i < 4; ++i) {
            int tmp;
            is >> tmp;
            if (tmp < 0 || 0xff < tmp)
                return false;
            if (i < 3 && std::is.get() != '.')
                return false;
            ipv4.part[i] = tmp;
        }
        return true;
    }
    


  • @Swordfish Ich finde es sehr schön, dass ein istream übergeben wird und nicht direkt auf cin gearbeitet wird, dafür einen Daumen hoch.



  • @Swordfish sagte in Ausgabe aller IP-Adressen:

    So schwer würde ich es mir garnicht machen.

    Das ist immer schön und gut, aber man möchte ja wahrscheinlich auch sowas wie "123 xxx hallo du da" ist keine gültige IP-Adresse! ausgeben können. Und das finde ich dann immer extrem schwierig, wenn man direkt aus dem Stream liest. Da kommt dann irgendwann "false" zurück, in meinem Beispiel wäre die 123 schon aus dem Stream weg - aber ich weiß nicht mehr, wie es dann weitergeht.



  • @wob Dann eben wie Du es machst vorher mit getline() lesen und in einen Stringstream stopfen ^^



  • Also ich würde es mit getline lesen und dann mit from_chars draufknüppeln.
    Das ist nicht nur schneller, es ist auch "kontrollierter" und unabhängig von globalem State (z.B. locale).
    Einen korrekten dotted IPv4 Parser zu schreiben der unabhängig von jeglichem globalen State ist, alle gültigen IPv4 Literals korrekt parsed (inklusive Oktal und Hex) und alle ungültigen rejected ist mit Streams denke ich gar nicht so einfach.


Anmelden zum Antworten