Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » cin eingabe eines int überprüfen

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
26.11.2006, 19:41 Uhr
angry_zweiblum



hilfe!!!

aufgabenstellung:
es soll ein int wert eingegeben werden -
bei fehlern (irgendwo ein char darunter) soll eine erneute eingabe erfolgen -

C++:
// int_test_1.0.cpp

#include <iostream>
using namespace std;
int in_test ();

int main ()
{

int zahl1;

do    {
cout<< "bitte erste zahl eingeben" << flush << endl;
cin>> zahl1;
    }while  (in_test() !=0);

cout<< "die zahl ist " << zahl1 + 1<< endl;

return 0;
}

int in_test ()
{
    if (cin.fail ())    {
    cout<< "fehler bei der eingabe" << endl;
    cin.clear();
    cin.seekg(0L,ios::end);
    return 1;            }    
    return 0;
}


gibt der user eine reine zahl (z.b. 1234) ein tut es was es soll......
wird an erster stelle ein char eingegeben (z.b. w1234) wird der fehler erkannt und der user muss eine neue eingabe machen........... soweit so gut........
wenn allerdings die erste ziffer eine zahl ist gefolgt von falschen eingaben (z.b. 12e34)
dann wird der int vor der fehlerstelle (12) angenommen und der user wird zu keiner weiteren eingabe gezwungen - eigentlich sollte er auch in diesem fall eine neue eingabe machen.

bisheriger lösungsansatz ist statt einem cin als int ein char array aufnehmen und stelle für stelle zu testen.....zu guter letzt dann das array mittels atoi wieder in einen int wandeln,
den das prog ja braucht.....

C++:
#include <iostream>
using namespace std;
int control (char *);

char zahl[10];
int zahl1;
int main ()
{
        do    {
        cout<< "zahl eingeben" << endl;
        cin>> zahl;
        }while (control (zahl) == 1);
        zahl1 = atoi (zahl);

cout<< "die zahl ist " << zahl1 + 1<< endl;

return 0;
}

int control (char * ch_zahl)
{
    for( int i=0; i<strlen (ch_zahl); i++)
    if ( ! ((int)ch_zahl[i] > 47 && ch_zahl[i] < 58))
        {
        cout<<"falsche eingabe - bitte noch einmal" << endl;
        return 1;
        }
        return 0;
}


diese version macht jetzt genau was ich von ihr verlange - finde es allerdings lästig den umweg über das array zu gehen..

gibt es irgendeine möglichkeit beim cin einen int zu übergeben und dennoch den vollen test zu fahren......

da ich mir seit tagen den kopf damit weich mache bin ich für jede hilfe dankbar

Dieser Post wurde am 26.11.2006 um 20:32 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.11.2006, 04:34 Uhr
~cincin
Gast



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

int main()
{
     int myint;
     char c;

     cin >> myint;
     cin.get(c);  

     while (c != '\n')
        {
           cout<<"falsche eingabe - bitte noch einmal" << endl;
           while (c != '\n') cin.get(c);  
           cin >> myint;
           cin.get(c);
        }
      return 0;
}


Kürzeres weiss ich auch nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.11.2006, 05:21 Uhr
~cincin
Gast


Obiges fängt leider nicht, wenn gleich als erstes ein buchstabe kommt, teste
mal folgendes Monster, ob nun alles abgefangen wird.

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

int main()
{
     int myint;
     char c;

     cin >> myint;
     while (cin.fail())
      {
         cin.clear();
         cin >> c;
         cin >> myint;
         cout<<"falsche eingabe - bitte noch einmal" << endl;
         cin >> myint;
      }

     cin.get(c);  

     while (c != '\n')
     {
           cout<<"falsche eingabe - bitte noch einmal" << endl;
           while (c != '\n') cin.get(c);  
           cin >> myint;
           while (cin.fail())
           {
                cin.clear();
                cin >> c;
                cin >> myint;
                cout<<"falsche eingabe - bitte noch einmal" << endl;
                cin >> myint;
           }
          
           cin.get(c);
        }
      return 0;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.11.2006, 09:12 Uhr
angry_zweiblum



@~cincin danke für dein reply......

genialer ansatz - damit komme ich der sache schon ein ganzes stück näher
einziges verbleibendes problem ist das bei einer eingabe der rest hinter dem fehler noch im buffer verbleibt.
wenn also we12we eingegeben wurde läuft es drei mal duch die schleife (gibt 3x falsche eingabe aus), fordert zur erneuten eingabe auf und meldet dann aber auf einen reinen zahlenwert wieder nen fehler. (beim nächstem versuch geht es dann allerdings)
noch ne idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.11.2006, 14:01 Uhr
~cincin
Gast


Die Problemstellung ist ne Template-Funktion wert.

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

template<typename T>
T cin_eingabe()
{
     T my;
     char c;

     cin >> my;
     cin.get(c);  

     while (c != '\n')
     {
           cin.clear();
           cout<<"falsche eingabe - bitte noch einmal" << endl;
           while (c != '\n') cin.get(c);  
           c = 0;
           cin >> my;
           cin.get(c);
      }
      return my;
}

int main()
{
     cout << "geben sie eine dezimalzahl ein" << endl;
     int myint = cin_eingabe<int>();
     cout << "geben sie ein double( punkt statt komma! ) ein" << endl;
     double mydouble = cin_eingabe<double>();
     cout << "geben sie eine dezimalzahl ein" << endl;
     unsigned myunsigned = cin_eingabe<unsigned>();

     return 0;
}



mfg
 
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: