Gültigkeit von cin.ignore() -GELÖST-



  • Mach ich gerne.
    Hatte auch schon im Internet gesucht, aber nichts detailliertes dazu gefunden.



  • Dein
    first = cin.get();
    entfernt nur ein einziges Zeichen aus dem Eingabestrom und weist es first zu.
    Wenn Du also 'Martin Müller' eingegeben hast, dann steht nach der Instruktion in first ein 'M' und im Eingabestrom cin 'artin Müller'.
    Wenn Du nun via ignore nur drei Zeichen aus dem Eingabestrom entfernst, dann steht da immer noch 'in Müller' drin.
    Dein nächster
    last = cin.get();
    nimmt nun wiederum ein einziges Zeichen aus diesem Strom und weist es last zu. Deshalb steht nun in first 'M' und in last 'i' und im Eingabestrom noch 'n Müller', was aber in Deinem im Eingangspost gezeigten Programm nicht mehr ausgewertet wird.
    Ausgegeben werden am Ende die Werte von first und last, also 'M' und 'i'.

    Alles klar?



  • Alles klar?

    Bis auf eine Sache ja. 😕 :
    Wenn man noch eine dritte Variable (z.B.

    char second;
    

    hinzufügt,bekommt sie über die Funktion

    cin.ignore(256,' ');
    

    das Zeichen "ü" zugewiesen. (Also Stream: "Martin Müller")

    Dies ist aber auch der Fall wenn der Stream z.B. "Martin Müller Meyer" lautet.
    Das verstehe ich nicht, da die Funktion doch weitere Zuweisungen zu einem Char erst wieder nach einem Leerzeichen durchführen soll.

    In Konsequenz sieht das für mich so aus, daß die zu erfolgende Zuweisung nach einem Leerzeichen nur einmal funktioniert.


  • Mod

    Ich glaube du solltest noch einmal ganz von vorne bei Variablen und den einfachen Eingabefunktionen anfangen. Da stimmt was hinten und vorne nicht.

    Wenn man noch eine dritte Variable (z.B.

    C/C++ Code:
    char second;
    C/C++ Code:
    char second;
    hinzufügt,bekommt sie über die Funktion

    cin.ignore(256, ' ');
    

    das Zeichen "ü" zugewiesen.

    Dies ist auch der Fall wenn der Stream wäre z.B. "Martin Müller Meyer" beinhaltet.
    Das verstehe ich nicht, da die Funktion doch weitere Zuweisungen zu einem Char erst wieder nach einem Leerzeichen durchführen soll.

    In Konsequenz sieht das für mich so aus, daß die zu erfolgende Zuweisung nach einem Leerzeichen nur einmal funktioniert.

    Ich verstehe die einzelnen Worte, aber zusammen geben sie keinen Sinn. Du musst da etwas ganz grundlegend falsch verstanden haben um solche Sätze über Variablen, Zuweisungen und Streams zu formulieren. Ich kann mich noch nicht einmal in dich hinein versetzen, was du dir vorstellst, um dich dann auf den rechten Weg zu führen. Das ist einfach zu verquer.



  • Ich kann mich noch nicht einmal in dich hinein versetzen, was du dir vorstellst, um dich dann auf den rechten Weg zu führen. Das ist einfach zu verquer.
    

    Macht nichts, wenn Du willst, dann schließ den Thread.
    Ansonsten kann ich gerne nochmal probieren, mein Anliegen verständlicher zu formulieren.



  • 🙂
    Mit

    cin.ignore(256,' ');
    

    werden entweder 256 oder alle Zeichen bis zum ersten Leerzeichen ignoriert, je nach dem was zuerst auftritt. Schematische Darstellung:

    Name:        Hans Müller Schmidt
    
    Stream:     [b]Hans Müller Schmidt[/b]
    
    first = cin.get();
    -->         Hans Müller Schmidt
                [e]uarr[/e]
                (wird gespeichert und gelöscht)
    
    Stream:     [b]ans Müller Schmidt[/b]
    
    cin.ignore(256, ' ');
    -->         ans Müller Schmidt
                [e]uarr[/e][e]uarr[/e][e]uarr[/e][e]uarr[/e]
                (wird ignoriert)
    
    Stream:     [b]Müller Schmidt[/b]
    
    last = cin.get();
    -->         Müller Schmidt
                [e]uarr[/e]
                (wird gespeichert und gelöscht)
    
    Stream:     [b]üller Schmidt[/b]
    
    Ausgabe:    HM
    

    Von da her ist es völlig egal, wie lang der Stream ist und was am Ende dort übrig bleibt. Ist deine Frage beantwortet?



  • Schritt für Schritt (nochmal):

    #include <iostream>
    using namespace std;
    
    int main () {
      char first, last;// Definition von first, last. Beide Werte nicht initialisiert. Sollte klar sein, aber man weiß ja nie.
    
      cout << "Enter your first and last names: ";
    
      /** ... der User gibt seinen Namen (bspw. "John Doe") ein, er wird folglich nach cin geschrieben. Der Stream enthält jetzt "John Doe" ... **/
    
      first=cin.get(); /* int istream::get(): "Extracts a character from the stream and returns its value (casted to an integer)." 
      Das heißt, das erste Zeichen (hier ein 'J') wird aus dem Stream entfernt und in first geschrieben. 
      In cin steht folglich nur mehr "ohn Doe", in first mittlerweise ein 'J'. */
    
      cin.ignore(256,' '); /* istream& istream::ignore(streamsize, int): "The extraction ends when n characters have been extracted and discarded or when the character
      delim is found, whichever comes first. [...]" Es werden also, in diesem Fall, maximal 256 Zeichen aus cin gelesen (und verworfen, d.h. "ignoriert"), es sei denn 
      es taucht ein Leerzeichen auf, bevor 256 Zeichen gelesen werden konnten.
      Bei "ohn Doe" ist das schon nach 3 Zeichen der Fall, es wird folglich "ohn " (samt Leerzeichen) entfernt. In cin steht noch "Doe", first und last bleiben unverändert */
    
      last=cin.get(); // Wieder dasselbe Spielchen wie oben. cin = "oe", last = 'D'
    
      cout << "Your initials are " << first << last; // Et voilà.
    
      return 0;
    }
    


  • Da was wohl wer (viel) schneller...doppelt hält besser. 🤡



  • redrew99 schrieb:

    Alles klar?

    Bis auf eine Sache ja. 😕 :
    Wenn man noch eine dritte Variable (z.B.

    char second;
    

    hinzufügt,bekommt sie über die Funktion

    cin.ignore(256,' ');
    

    das Zeichen "ü" zugewiesen.

    Nein. Über die Funktion ignore bekommt niemand irgendwas zugewiesen. ignore entfernt lediglich Zeichen aus dem Stream. Und zwar nur zu dem Zeitpunkt, zu dem die Funktion auch aufgerufen wird. Rufst Du ignore also nur einmal auf, werden auch nur einmal Zeichen bis zum nächsten Leerzeichen entfernt, weitere Leerzeichen weiter hinten im Stream bleiben drin und folgende get - Aufrufe holen nun immer das nächste Zeichen.
    Um bei meinem Beispiel zu bleiben, wenn first = 'M' und last = 'i' geworden ist, dann ist das nächste Zeichen im Stream ein 'n'. Hast Du vorher ignore(256, ...) anstatt ignore(3, ...) gemacht, dann steht in first ein 'M' in last auch ein 'M' (nach der Eingabe 'Martin Müller ...' und ein weiteres get OHNE ein erneutes ignore liefert dann natürlich das 'ü', weil das das nächste Zeichen im Stream ist. Willst Du stattdessen nach 'Martin Schmitz Bäcker' 'M' 'S' und 'B' haben, dann musst Du
    get ignore get ignore get aufrufen, damit auch die Zeichen nach dem 'S' bis zum nächsten Leerzeichen aus dem Stream entfernt werden.



  • Belli schrieb:

    Willst Du stattdessen nach 'Martin Schmitz Bäcker' 'M' 'S' und 'B' haben, dann musst Du get ignore get ignore get aufrufen, damit auch die Zeichen nach dem 'S' bis zum nächsten Leerzeichen aus dem Stream entfernt werden.

    Ok. Jetzt habe ich alles Verstanden 🙂

    Danke an alle für tatkräftige Unterstützung 🙂


Anmelden zum Antworten