Ausgabe aller IP-Adressen
-
@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 daswhile
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 mitcin.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 mitfrom_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.