# Eingabefehler - Buchstaben in Zahlen verhindern?



## freak_xyz (8. Mai 2007)

Hi, wir haben die Aufgabe ein Programm zu programmieren, welches mit Matrizen rechnen kann. Da wir das gerne perfekt machen wollen, suchen wir schon den ganzen Nachmittag nach irgendeinem Ansatz eine solche Fehleingabe 

*12342g1343* zu vermeiden, bzw. die Eingabe wieder neu aufzurufen. 

Unser letzter Ansatz war:


> int main() {
> char beenden;double zahl=0;
> cin>>zahl;
> if (!(cin >> zahl)){
> ...


Diese variante "merkt" zwar , dass dies *12342g1343* ein tippfehler ist, doch leider muss man "korrekte Zahlen" doppelt eingeben.

Ich hoffe jemand kann uns weiterhelfen.


----------



## andy72 (9. Mai 2007)

Erstmal kannst Du Dir mal die C++ Referenz zu Zeichenketten (strings) unter angegeb. Adresse ansehen, evtl. hilft ja das schon weiter 

http://www.cppreference.com/stdstring/index.html


----------



## deepthroat (9. Mai 2007)

Hi.





freak_xyz hat gesagt.:


> Hi, wir haben die Aufgabe ein Programm zu programmieren, welches mit Matrizen rechnen kann. Da wir das gerne perfekt machen wollen, suchen wir schon den ganzen Nachmittag nach irgendeinem Ansatz eine solche Fehleingabe
> 
> *12342g1343* zu vermeiden, bzw. die Eingabe wieder neu aufzurufen.
> 
> ...


Naja, ihr lest ja auch zweimal ein, allerdings prüft ihr nur die zweite Eingabe auf Fehler?! Der erste Wert wird einfach gelesen und ihr überprüft nicht ob die Eingabe erfolgreich war.


```
double zahl;

if (cin >> zahl) {
  // zahl wurde korrekt eingelesen
} else {
  // Fehler bei der Eingabe.
  string tmp;
  cin.clear();
  getline(cin, tmp); // komplette Zeile einlesen und verwerfen.
  cerr <<  "Fehler: Gleitkommazahl erwartet.\n";
}
```
Das ganze solltet ihr dann natürlich in einer Schleife machen (und in eine Funktion packen).

Übrigens wird bei der Eingabe "999.4fff" die Zahl 999.4 eingelesen. Erst wenn danach nochmal versucht wird eine Zahl einzulesen schlägt die Eingabe fehl.

Gruß


----------



## freak_xyz (15. Mai 2007)

Hi, das hat so, wie ihr vorgeshclagen habt, nicht ganz funktioniert.
Ich möchte hier aber der Vollständigkeit halber mal unsere version posten. Gibt ja bestimmtnoch mehr Leute die das Problem haben und verzweifelt eine Lösung suchen.


```
#include <iostream>
#include <sstream>
#include <iomanip>
#include <conio.h>
using namespace std;

double eingabe();

int main(){
    double e;
    e=eingabe();
    cout.precision(4);
    cout << setiosflags(ios_base::fixed);
    cout<<"\n"<<e;
    getch();
    return 0;
}

double eingabe(){
       double z, n;                    //Zähler, Nenner
       bool a=0, b=0;
       string zaehler(""), nenner("");
       char c;                         //einzugebenden Zeichen
       c=getch();
       while(!(c==13 && zaehler!=""))  //bricht ab bei Enter und wenn zahl eingegeben
       {if(c=='/' && b==0 && zaehler!="")    //erkennt Eingabe von Bruch
         {b=1;                     //fortfahren mit Eingabe von nenner
          a=0;                     //Dezimalpkt. in nenner wieder möglich
          cout<<c;}                //Ausgabe des Bruchstrichs
        if(c=='-' && zaehler=="" && b==0)    //negatives Vorzeichen
          {zaehler+=c;            //Zeichen an string anfügen
           cout<<c;}
        if((c==',' || c=='.') && a==0 && b==0) //erkennt Dezimalpkt. in zaehler
          {zaehler+='.';            //Zeichen an string anfügen
           cout<<".";
           a=1;}                    //kein weiterer Dezimalpkt. in zaehler möglich
        if(c>='0' && c<='9' && b==0)         //Zifferneingabe für zaehler
          {zaehler+=c;              //Zeichen an string anfügen
           cout<<c;}
        if(c=='-' && nenner=="" && b==1)    //negatives Vorzeichen
          {nenner+=c;            //Zeichen an string anfügen
           cout<<c;}
        if((c==',' || c=='.') && a==0 && b==1) //erkennt Dezimalpkt. in nenner
          {nenner+='.';             //Zeichen an string anfügen
           cout<<".";
           a=1;}                    //kein weiterer Dezimalpkt. in nenner möglich
        if(c>='0' && c<='9' && b==1)         //Zifferneingabe für nenner
          {nenner+=c;               //Zeichen an string anfügen
           cout<<c;}
           c=getch();                  //Eingabe nächstes Zeichen
       }
       istringstream inStream(zaehler);   //Umwandlung zaehler in Zahl
       inStream >> z;
       if(b==1)                        //falls Bruchstrich eingegeben
         {istringstream inStream(nenner); //Umwandlung nenner in Zahl
          inStream >> n;
          if(n==0 || nenner=="")       //falls nenner 0 Eingabe wiederholen
            {cout<<"\nNenner darf nicht 0 sein! ";
             return eingabe();}
          z=z/n;}                      //Zahl wird zaehler/nenner
       return z;                       //Rückgabe der Zahl
       }
```


----------

