Gültigkeit von cin.ignore() -GELÖST-
-
#include <iostream> using namespace std; int main () { char first,last; cout << "Enter your first and last names: "; first=cin.get(); cin.ignore(256,' '); last=cin.get(); cout << "Your initials are " << first << last; return 0; }Die Funktion
cin.ignore(256,' ')ignoriert 256 Zeichen bis zur Eingabe eines Leerzeichens. Die Funktion wird seltsamerweise auch auf die Variabe "last" angewendet.
Wenn man allerdings den Parameter "256" auf z.B. "3" abändert, müßte die Funktion bei der Eingabe von z.B. "Arne Müller" bei "Müller" nur 3 Zeichen ignorieren, es werden aber alle nach dem "M" ausgeblendet.
Weiß jemand, woran das liegt?
-
Die Funktion
cin.ignore(256,' ')ignoriert 256 Zeichen bis zur Eingabe eines Leerzeichens. Die Funktion wird seltsamerweise auch auf die Variabe "last" angewendet.
Häh?
Beschreib mal Eingabe, Ausgabe und was du stattdessen erwartest.
-
was denkst du, wie viel du in
char first, last;speichern kannst?
-
[Rewind] schrieb:
was denkst du, wie viel du in
char first, last;speichern kannst?
Du meinst er hat den Code einfach nur aus dem Internet zusammen kopiert und weiß noch nicht einmal, was Initialen sind? Aber das würde doch niemals jemand tun! :p
-
Wenn die Funktion
cin.ignore(3,' ');lautet, würde ich bei einer Variable erwarten, daß bei der Eingabe von "Martin" als Ergebnis "Min" ausgegeben wird. (a-t werden ignoriert)
Bzw. bei Eingabe von "Martin Muster" bei 2 Variablen würde ich die Ausgabe "MinMer" erwarten.
Es wird aber "Mi" ausgegeben.Den Code habe ich übrigens von
-
[Rewind] schrieb:
was denkst du, wie viel du in
char first, last;speichern kannst?
1 Zeichen normalerweise. (also pro Variable natürlich)
-
redrew99 schrieb:
daß bei der Eingabe von "Martin" [...] (a-t werden ignoriert)
[...]
1 Zeichen normalerweise. (also pro Variable natürlich)
[...]
Es wird aber "Mi" ausgegeben.
Jetzt zähl mal 1 und 1 zusammen.
Und übe dich in genauer Sprechweise. Bei 70% der Sachen die du sagst habe ich keine Ahnung was du meinst. Insbesondere deine Benutzung des Wortes "Variable". Ich befürchte du meinst großen Unsinn, aber eventuell drückst du dich auch nur arg ungeschickt aus.
-
Glaube, ich habe es jetzt verstanden.
Der Fehler lag in der Annahme,daß die Funktion
cin.ignore(256,' ')neu ausgeführt wird, sobald ein Leerzeichen eingegeben wurde.
Das stimmt aber halt nur bedingt, nämlich bis zu der Anzahl von 256 eingegebenen Zeichen.
-
redrew99 schrieb:
Bzw. bei Eingabe von "Martin Muster" bei 2 Variablen würde ich die Ausgabe "MinMer" erwarten.
redrew99 schrieb:
[Rewind] schrieb:
was denkst du, wie viel du in
char first, last;speichern kannst?
1 Zeichen normalerweise. (also pro Variable natürlich)
...
-
Jupp, das widerspricht sich, was mir auch bewußt war, ich hatte aber keine Erklärung dafür, deswegen mein Post.
Wenn man noch dritte Variable hinzufügen würde, müßte das dann vermutlich so aussehen:
#include <iostream> using namespace std; int main () { char first, last, second; cout << "Enter your first and last names: "; first=cin.get(); cin.ignore(256, ' '); last=cin.get(); cin.ignore(256, ' '); second=cin.get(); cout << "Your initials are " << first << last<<second; return 0; }
-
Du solltest dir noch einmal genauer durchlesen, was ignore macht. Insbesondere da dies ja auch das ist, was du ohnehin lernen wolltest. Ich bin mir recht sicher, du hast noch nicht verstanden, was es macht.
-
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.
-
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 Funktioncin.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.
-

Mitcin.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: HMVon 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.