Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » cin einlesung funktioniert nicht korrekt

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.06.2015, 10:59 Uhr
~benutzi
Gast


Hallo

Ich habe dieses Programm geschrieben.
Wenn ich einen buchstaben, oder eine zu grosse zahl eingebe erscheint die fehlermeldung.
Wenn ich eine gültige zahl eingebe und enter drücke passiert nichts.
gebe ich anschliessend noch eine zahl ein, steht
du hast (dan erscheint die zweite zahl) eingegeben.
Was habe ich falsch gemacht?



C++:
#include <iostream>
using namespace std;

int main() {
    
    int i = 0;
    
    cout << "Gib eine Ganzzahl ein: ";
    cin >> i;
    
    if (cin >> i)    {
    cout << "Du hast " << i << " eingegeben \n \n";
}
    else   {
        cerr << "\nFehler bei der eingabe \n \n";
    }
    return 0;
}



-----
Edit: cpp-Tags eingefügt.

Dieser Post wurde am 21.06.2015 um 15:12 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.06.2015, 15:30 Uhr
Hans
Library Walker
(Operator)


Hi,

in dieser Zeile:

C++:

  if (cin >> i)    {


steckt der Fehler. Da wird nämlich eine weitere Tasturabfrage durchgeführt, und das daraus folgende Ergebnis an i zugewisesen. D.h. der Inhalt von i wird erneut geändert. Und erst diese Änderung wird durch die if-Abfrage behandelt.
Erklär doch mal genauer, was Du machen willst, dann kann man Dir auch den Weg dahin erläutern.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.06.2015, 17:24 Uhr
~benutzi
Gast


Wenn ich eine gültige zahl eingebe, und ich dann enter drücke,
möchte ich dass die anweisung im if ausgeführt wird, ohne dass ich nochmals eine zahl eingeben muss.

vielen dank in voraus fuer deine antwort

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.06.2015, 02:15 Uhr
Hans
Library Walker
(Operator)


Hi,

das hab ich mir schon fast gedacht. Wenn Du cin mit dem Datentyp int verwendest brauchst Du da eigentlich gar nichts mehr zu überprüfen, weil cin Dir die Arbeit schon abnimmt.

Wenn Du es trotzdem machen willst, wird es recht umständlich, denn dann musst Du in einer Schleife folgende Dinge tun:
* ein Zeichen einlesen, etwa mit cin.get(c),
* Wenn es das Zeichen für '\n' war, wurde die Enter- oder Returntaste gedrückt, dann die Schleife ohne Fehlermeldung abbrechen;
* '+' ignorieren, denn die Zahl +1 ist die selbe wie 1
* '-' als erkennung für negative Zahlen lassen wir mal weg; ich erwähne es hier nur der Vollständigkeit halber.
* überprüfen, ob das Zeichen eine Ziffer ist oder nicht, (mit isdigit(c) aus <cctype> )
* Wenn an dieser Stelle kein Ziffernsymbol eingegeben wurde, die Schleife mit einer Fehlermeldung abbrechen; isdigit liefert dann 0 (null).
* wenn es ein Ziffernsymbol ist, also '0'..'9', dann dieses Symbol in den entsprechenden Zahlenwert konvertieren (ziffer=c-'0') und
* die so erhaltene Ziffer entsprechend ihrer Wertigkeit der einzugebenden Zahl zuordnen. (zahl=zahl*10+ziffer)

Wenn ich Dich jetzt reichlich verwirrt habe, dann war das nur zum Teil Absicht, weil der Vorgang im Deteil betrachtet so umfangreich ist, dass er sich mit wenigen Worten nur in so einer abstrakten Form ausdrücken lässt.
Das ganze funktioniert so auch erst mal nur mit positiven Zahlen. Wenn du auch negative Zahlen berücksichtigen willst, wird es noch etwas komplizierter.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 22.06.2015 um 02:16 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.06.2015, 09:59 Uhr
ao

(Operator)


Hi,

solche Do-it-yourself-Lösungen sollte man nur einsetzen, wenn es dafür zwingende Gründe gibt. Es ist praktisch immer die bessere Idee, auf bestehende Bibliotheks-Routinen zurückzugreifen. Auch wenn das heißt, dass man zuerst ein bisschen lesen muss, um zu verstehen, wie die Routinen zu benutzen sind.

Abgesehen von der C-Lösung mit atoi (wenn Fehleingaben ausgeschlossen sind) oder mit strtol (wenn Fehleingaben möglich sind) könnte eine C++-Lösung zum Beispiel so aussehen:


C++:
#include <iostream>
using namespace std;

int main() {
    
    int i = 0;
    
    while (i != 123)    //    123 beendet das Programm
    {
        cout << "Gib eine Ganzzahl ein: ";
        cin >> i;
        if (cin.good ())
        {
            cout << "Du hast " << i << " eingegeben \n \n";
        }
        else  
        {
            cerr << "\nFehler bei der eingabe \n \n";
            cin.clear ();        //    Fehlerbits löschen
            cin.ignore ();        //    Fehlerhaftes Zeichen wegwerfen
        }
    }
    return 0;
}



Zum Nachlesen, wie man mit std::cin umgeht, taugen diese Artikel:
http://stackoverflow.com/questions/16726657/checking-for-valid-type-input-using-stdcin-c
http://stackoverflow.com/questions/20287186/how-to-check-if-the-input-is-a-valid-integer-without-any-other-chars

sowie die Referenzbeschreibung des Objekts std::cin, welches vom Typ std::istream ist:
www.cplusplus.com/reference/iostream/cin/
www.cplusplus.com/reference/istream/istream/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.06.2015, 17:53 Uhr
~benutzi
Gast


Vielen dank fuer eure antworten.

Jetzt funktioniert das Programm, wie ich es mir vorgestellt habe:

C++:
#include <iostream>
using namespace std;

int main() {
    
    int i = 0;
    
    while (i != 123)    //    123 beendet das Programm
    {
        cout << "Gib eine Ganzzahl ein: ";
        cin >> i;
        if (cin.good ())
        {
            cout << "Du hast " << i << " eingegeben \n \n";
        }
        else  
        {
            cerr << "\nFehler bei der eingabe \n \n";
        }
        return 0;
    }
}



Warum funktioniert es mit einer while schleife, und mit if nicht??

-----
Edit: cpp-Tags gesetzt.

Dieser Post wurde am 23.06.2015 um 02:26 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.06.2015, 02:35 Uhr
Hans
Library Walker
(Operator)


Hi,

das funktioniert deshalb nur mit der Schleife, weil Du ja jede Ziffer einzeln überprüfst, also alles so oft machst, wie die Zahl Ziffern hat. Eine if-Abfrage wird dagegen nur einmal durchlaufen.

----

@ao: Auch gut. Die von mir oben beschriebene Lösung sieht so aus, wobei ich auch noch negative Zahlen berücksichtige, was aber nicht wirklich elegant gelöst ist.

C++:
///////////////////////////////////////////////////////////////////////////////////////
/* Datei: cintest2.cpp

   Aus dem C/C++ Forum.
   Von mir modifizierte Version zum testen der Eingabe, wobei jedes Zeichen einzeln
   überprüft wird.
*/


#include <iostream>
#include <cctype>
#include <cstdlib>

using namespace std;

int main()
{
    char c, flag;
    int zahl, ziffer;
    
    zahl = ziffer = 0;
    flag = 0;
    cout << "Gib eine Ganzzahl ein: ";
    
    while (1)
    {
      cin.get(c);
      if (c=='\n')
         break;
      if (c=='-')
         {
           flag = 1;
           continue;
         }  
      if (isdigit(c))
         {
           ziffer = c-'0';
           zahl = zahl * 10 + ziffer;
         }
      else  
         {
            cerr << "\nFehler bei der eingabe \n";
            exit(1);
         }
    } // while
    if (flag ==1)
       zahl = zahl * -1;
    cout << "Du hast " << zahl << " eingegeben \n";
    
    return 0;
}



Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 23.06.2015 um 02:39 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.06.2015, 12:06 Uhr
ao

(Operator)



Zitat von ~benutzi:
Warum funktioniert es mit einer while schleife, und mit if nicht??

Die While-Schleife habe ich eingesetzt, um das Programm nicht für jede Umwandlung neu starten zu müssen. Es läuft dadurch so lange, bis man 123 eingibt.

Dein erstes Programm lief nicht richtig, weil du "cin >> i" zweimal aufgerufen hast, einmal vor dem if und einmal in der Bedingungsprüfung. Und natürlich, weil die Stream-Reparatur fehlte.

In deinem letzten Programm machst du am Ende des ersten While-Durchlaufs ein return 0, damit entartet die while-Schleife de facto zum if. Solange du das drinhast, ist es völlig wurscht, ob du oben while oder if schreibst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: