AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[C++] "cin" wird übersprungen

Ein Thema von Matze · begonnen am 8. Nov 2007 · letzter Beitrag vom 11. Nov 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#11

Re: [C++] "cin" wird übersprungen

  Alt 10. Nov 2007, 11:37
Tja, habe leider kein C / C++ konne also nur raten...
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: [C++] "cin" wird übersprungen

  Alt 10. Nov 2007, 11:54
Achso, dennoch vielen Dank. Wenigstens ist das alte Problem mit der Endlosschleife nun gelöst und das andere ist bestimmt auch irgendwie behebbar.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: [C++] "cin" wird übersprungen

  Alt 10. Nov 2007, 12:44
Hallo Matze,

Vielleicht Hilft Dir das weiter:

Code:
 do
{

   if (! ersterDurchlauf)
   {
     cout << "\n\t --> Fehleingabe!\n";
     cout << "\n    Geben Sie eine ganze Zahl zwischen 1 und 4 ein.\n";
   }
   ersterDurchlauf = false;
   while (!(cin >> eingabe))
   {
     cin.clear();
     while (cin.get() != '\n');
     cout << "\n\t --> Fehleingabe!\n";
     cout << "\n    Geben Sie eine ganze Zahl zwischen 1 und 4 ein.\n";
   }

}
while (! ((eingabe == 1) || (eingabe == 2) || (eingabe == 3) || (eingabe == 4)));
Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: [C++] "cin" wird übersprungen

  Alt 10. Nov 2007, 12:49
Hallo Chemiker,

klasse, das funktioniert, herzlichen Dank.
Dann mach ich mich mal dran, zu verstehen, was da nun genau passiert.

Edit: Das ganze Zeugs mit ersterDurchlauf kann ich mir so auch ersparen, sehr schön.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: [C++] "cin" wird übersprungen

  Alt 10. Nov 2007, 13:33
Hallo Matze,

Zitat:
Dann mach ich mich mal dran, zu verstehen, was da nun genau passiert.
viel Spaß dabei.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#16

Re: [C++] "cin" wird übersprungen

  Alt 10. Nov 2007, 15:35
Hi,

danke. Ganz steige ich noch nicht durch, cin ist komplexer als ich dachte.

Code:
do
{
    while (! (cin >> eingabe))
    {
        cin.clear();                 // das löscht die Fehler-Flags (welche auch immer das sind)
        while (cin.get() != '\n');   // das liest die Zeichen im Puffer so lange ein (und entfernt sie daraus),
                                      // bis ein "\n" (Return) kommt
        cout << "\n\t --> Fehleingabe!\n";
    }
}
while (! ((eingabe == 1) || (eingabe == 2) || (eingabe == 3) || (eingabe == 4)));
Was die diese Zeile

Code:
while (! (cin >> eingabe))
genau macht, konnte ich nicht herausfinden. Ich weiß auch nicht, wie der <<-Operator heißt, daher kann ich auch nicht gezielt suchen.

Das Problem bei dem Code ist jedoch noch, dass bei Eingabe von Buchstaben die Meldung "Fehleingabe" ausgegeben wird, wenn ich jedoch ganze Zahlen eingebe, sehe ich keine Meldung, muss aber weitere Zahlen eingeben, bis sie 1, 2, 3 oder 4 ist. Ich denke, für diesen Fall brauche ich dann doch die boolsche Variable ersterDurchlaf.
Daher vermute ich, dass der boolsche Ausdruck der genannten Zeile wahr ist, wenn die Zuweisung des Eingabewerts zur Variablen eingabe erfolgreich war, es sich also um den selben Datentyp handelt.

Ist das richtig?

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: [C++] "cin" wird übersprungen

  Alt 10. Nov 2007, 17:16
Hallo Matze,

Code:
(cin >> eingabe)
Das kann wie eine normale Boole´schen Ausdruck testen, dies ist in der Klassendefinition so festgelegt.
Der Ausdruck (cin >> eingabe) wird in einen Zeiger umgewandelt, dessen Wert vom Fehlerstatus des Streams abhängt. Ist der Zeiger NULL (also FALSE) zeigt er an, dass ein Fehler im Stream aufgetreten ist. Während ein Nicht-Null-Zeiger (also TRUE) angibt, dass kein Fehler vorhanden ist.
Man kann dann das ganze mit ! umkehren , so dass
Code:
(!(cin >> eingabe))
TRUE ist, wenn ein Fehler in cin – Stream auftritt und FALSE bei Fehlerlosigkeit.

Ich hoffe das ist so ungefähr richtig ist.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: [C++] "cin" wird übersprungen

  Alt 10. Nov 2007, 18:01
Hallo Chemiker,

danke, das mit dem Zeiger wusste ich noch nicht. Dann weiß ich das nun auch.

Grüße
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#19

Re: [C++] "cin" wird übersprungen

  Alt 11. Nov 2007, 12:11
Um es etwas klarer zu machen:
1. >> heißt entweder operator>>, Shiftoperator oder Streamoperator. Damit solltest du suchen können (oder einfach auf cppreference.com oder cplusplus.com mal unter iostream gucken). Bei diversen Fragen, insbesondere esoterischen, sollte auch das C++ FAQ Lite eine Anlaufstelle sein. Dort findet sich auch ein schönes Beispiel für ignore:
Code:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Edit: Oh, und allgemein für dein Problem FAQ 15.2.
2. Alle standardmäßig definierten operator>>, die einen istream& als ersten Parameter nehmen, haben auch wieder istream& als Rückgabewert. In der Praxis bekommst du also die Referenz auf den Stream zurück, um den Aufruf verketten zu können.
Code:
if (cin >> eingabe)
ist also dasselbe wie
Code:
cin >> eingabe;
if (cin)
Der Ausdruck wird selbstverständlich nicht in einen Zeiger umgewandelt, sondern in bool konvertiert (operator bool(), falls du dich an den anderen Thread erinnerst ) und kann damit auf true oder false überprüft werden. Im weitesten Sinne ist false dabei die Entsprechung zu bad() und true die Entsprechung zu good().
3.
Wenn man so will, hast du recht, der Ausdruck aus 2. wird true, wenn eingabe korrekt gefüllt werden konnte, und false, wenn nicht.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: [C++] "cin" wird übersprungen

  Alt 11. Nov 2007, 12:55
Hallo,

vielen Dank für deinen Beitrag. Dann müsste nun ja alles geklärt sein.
Speziell die Links sind super und werde ich mir näher ansehen.

Grüße
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz