Hilfe!!! Hilfe!!! Fachabitur!!!



  • Mr. XXX schrieb:

    ich werde die variable ja mit als charakter einlesen muss die aber in 4 int variabeln packen aber das stellt sich als schwieriger herraus als doch dachte

    Geht sogar mit C super einfach: strtoul.



  • Du musst gar nicht den Umweg über string gehen, du kannst die einzelnen Teile gleich in ints lesen:

    int ip_1, ip_2, ip_3, ip_4;
        char c;
        cin >> ip_1 >> c >> ip_2 >> c >> ip_3 >> c >> ip_4;
        cout << ip_1 << "." << ip_2 << "." << ip_3 << "." << ip_4 << endl;
    


  • Mr. XXX schrieb:

    ich werde die variable ja mit als charakter einlesen muss die aber in 4 int variabeln packen aber das stellt sich als schwieriger herraus als doch dachte

    Das ist eigentlich noch das leichteste an der Übung, mach einfach ein paar cin's hintereinander, und spar dir das ganze Umwandeln.



  • War zu langsam. 🙂 Marsmann hat es bereits hingeschrieben.



  • Marsmann schrieb:

    Du musst gar nicht den Umweg über string gehen, du kannst die einzelnen Teile gleich in ints lesen:

    int ip_1, ip_2, ip_3, ip_4;
        char c;
        cin >> ip_1 >> c >> ip_2 >> c >> ip_3 >> c >> ip_4;
        cout << ip_1 << "." << ip_2 << "." << ip_3 << "." << ip_4 << endl;
    

    Das dieser Code aber ein bisschen unsicher ist, weißt du?

    1. Was, wenn der Benutzer statt einer Zahl ein Zeichen eingibt? Auf meiner Maschine führt das sofort zum Beenden des Programms.
    2. Außerdem kann der Benutzer auch versuchen, Adresse ohne Punke einzugeben, was garantiert zu einem Fehler führt, denn dann wird alles in ip_1 gesichert und der Benutzer hängt in 6 weiteren Eingaben fest.
    3. Ich weiß nicht genau, was passiert, wenn der Benutzer aus Versehen zwei Punkte hintereinander eingibt. Zwei Szenarien: entweder wird alles bis zur nächsten Zahl in c überschrieben, oder die ganze Zahl wird ignoriert. Beides stimmt mich nicht zuversichtlich.



  • @ TE: Du kannst die Benutzereingabe überprüfen, an jedem Punkt spliten, die Zahlenstrings selbstständig in int umwandeln (ist nicht so schwer, vom Buchstaben den Wert 48 abziehen und nach jeder Stelle den Wert zur nächsten Potenz von 10 hochrechnen) und dann mit meiner Formel wieder ins Binärformat schreiben.

    Eingabe spliten -> einzelne Strings
    Einzelne Strings in int s umwandeln -> einzelne Zahlen
    Einzelne Zahlen in Binär umwandeln -> einzelne Strings

    Nur noch mal zur Übersicht!



  • Glühbirne schrieb:

    Das dieser Code aber ein bisschen unsicher ist, weißt du?

    Das gilt für ca. 99% der Eingaben bei Schulaufgaben.

    Glühbirne schrieb:

    1. Was, wenn der Benutzer statt einer Zahl ein Zeichen eingibt? Auf meiner Maschine führt das sofort zum Beenden des Programms.

    Wenn man es sicher haben will, kann man den Status des Streams abfragen und entsprechend handeln.

    Glühbirne schrieb:

    2. Außerdem kann der Benutzer auch versuchen, Adresse ohne Punke einzugeben, ...

    Das sollte der Benutzer nicht versuchen, da das Unsinn ist. Aber, wie gesagt, man kann es auch "sicher" haben wenn man den Aufwand nicht scheut.

    Übrigens musst du, falls du einen String einliest, bei der Umwandlung ebenfalls auf falsche Eingaben reagieren, falls du es "sicher" haben willst. Der Aufwand dürfte entsprechend sein.



  • Mitleid schrieb:

    ...

    Wenn er 'ne gute Arbeit schreiben will, sollte ihm der Mehraufwand dies doch Wert sein, oder?



  • also ich scheue mich nich vor einem hohen aufwand 😃
    allerdings kann ich nicht mehr ganz folgen
    wie kann man den status abrufen??
    und in wie fern kann mir das helfen ??



  • Gepufferte Streams ( cout und cin sind welche) verfügen wie der Name sagt über einen Puffer. Alles, was über diese Streams kommt, wird erstmal im Arbeitsspeicher gesichert, weshalb du Informationen über die Ein- und Ausgaben abfragen kannst. Mit der Funktion rebuf kannst du dir die Adresse des streambuf -Objektes holen, mit dem du den Stream überprüfen kannst.

    Hilft das?



  • Wenn nein, hilft google.



  • Glühbirne schrieb:

    Wenn er 'ne gute Arbeit schreiben will, sollte ihm der Mehraufwand dies doch Wert sein, oder?

    Da würde ich mich beim Dozenten erkundigen. In so einem Fall kann es leicht sein, dass die Kontrolle der Eingabe dann den überwiegenden Teil des Programms ausmacht.

    Mr. XXX schrieb:

    ... wie kann man den status abrufen??
    und in wie fern kann mir das helfen ??

    Wenn du im Stil von Marsmann etwas aus dem Eingabepuffer liest und in der Eingabe hat man sich nicht an die Reihenfolge int char int char int char int gehalten würde das auffallen und das Streamobjekt cin ginge in einen Fehlerzustand den du abfragen könntest.

    http://www.cplusplus.com/reference/iostream/istream/

    Ist das der Fall, kannst du den Eingabestream leeren. Und die Eingabe nochmal erfolgen lassen.

    Ist nach diesen 7 cin's der Eingabestream nicht im Fehlerzustand, müsstest du immer noch prüfen, ob die eingelesenen int's im Bereich 0 bis 255 sind und, wenn du es ganz pedantisch machen willst kannst du auch noch prüfen, ob alle eingegebenen char's ein '.' sind.

    Dann hast du einigermaßen sichergestellt, dass die Eingabe passt.

    P.S. mit cin hast du bereits ein Objekt, dessen Eigenschaften du dann abfragen kannst.

    Also z.B.:

    if (cin.fail()) 
    		cout << "Falsche Eingabe Blödmann!" << endl;
    

    Waaaahhhnsinn! Welch Mitgefühl das Forum heute wieder zeigt. 😃



  • Mitleid schrieb:

    Wenn du im Stil von Marsmann etwas aus dem Eingabepuffer liest und in der Eingabe hat man sich nicht an die Reihenfolge int char int char int char int gehalten würde das auffallen

    Aber - wie schon Glühbirne schrob - im schlechtesten Fall bleibt die Konsole 'hängen' und man muss mehrmals 'Enter' bzw. irgendein Zeichen und 'Enter' eingeben.
    Deshalb ist es möglicherweise besser, die ganze Zeile in einen String einzulesen, diesen in einen Stringstream zu bugsieren und mit dem dann die >> Operation auszuführen.
    @Mr. XXX:
    Deine Chancen, hier konkretere Hilfen zu bekommen, würden stark ansteigen, wenn Du mal irgendwas halbwegs Sinnvolles an Code zeigen würdest. Wenn da so gar nichts kommt ... glaubst Du, wir schreiben hier Dein Programm?



  • vielen vielen dank euch
    ich glaube ich habe alles verstanden und werde das auf jedenfall ausprobieren
    ihr seit die besten 😃



  • Seit Anbeginn der Zeit seid ihr die besten.



  • HighLigerBiMBam schrieb:

    Seit Anbeginn der Zeit seid ihr die besten.

    Wollte auch gerade verbessern 😃



  • Belli schrieb:

    ..Deshalb ist es möglicherweise besser, die ganze Zeile in einen String einzulesen, diesen in einen Stringstream zu bugsieren und mit dem dann die >> Operation auszuführen.

    Ja!
    Man könnte einer "zu kurzen" Eingabe auch noch anders auf die Pelle rücken, aber deine Variante ist wohl einfacher und sinnvoller.


Anmelden zum Antworten