Verhindern, dass einer Integer Variabel per Tastatureingabe ein Char zugewiesen wird?!



  • Hallo,

    ich brauche für ein Programm eine Funktion mit der ich eine Fehlermeldung ausgeben kann, falls statt einem Integer Wert ein Char Wert eingegeben wird.

    Das Programm funktioniert über die Konsole. Die Eingabe frage ich per "cin" ab. Nur ist die Variable in der die Eingabe gespeichert wird vom Typ Integer, d.h. wenn ich ein Buchstabe eingebe, hängt sich das Programm auf.

    Ich möchte jedoch, dass er eine Fehlermeldung ausspuckt und danach nochmal fragt. Gibt es da eine einfache Möglichkeit?

    Ich habe mir gedacht die Eingabe in eine char Variable zu speichern und dann umzuwandeln, aber dazu nicht verständliches gefunden.

    Wäre für Lösungsvorschläge sehr dankbar...

    ciao Peter



  • > aber dazu nicht verständliches gefunden.

    Siehe FAQ: Einmal nach int und zurück.


  • Mod

    Peter12345 schrieb:

    Das Programm funktioniert über die Konsole. Die Eingabe frage ich per "cin" ab. Nur ist die Variable in der die Eingabe gespeichert wird vom Typ Integer, d.h. wenn ich ein Buchstabe eingebe, hängt sich das Programm auf.

    Das ist ein bisschen ungenau, cin hat viele Methoden. Ich rate mal, dass du den Operator >> meinst. In diesem Fall wird bei einer unpassenden Eingabe das Fehlerflag von cin gesetzt.

    Kleines Beispiel dazu:

    #include<iostream>
    
    using namespace std;
    
    int main(){
    
      int eingabe=1;
      cout<<"Dieses Programm liest Zahlen ein. 0 zum Beenden"<<endl;
      while(eingabe){
        cin>>eingabe;
        if (cin){    // Wenn kein Fehler
          cout<<"Eine Zahl wurde eingelesen. Sie lautet: "<<eingabe<<endl;
        }
        else{        // Wenn Fehler
          cout<<"Etwas das keine Zahl ist, wurde eingegeben. Ignoriere ein Zeichen und versuche erneut eine Zahl zu lesen."<<endl;
          cin.clear();      // Fehlerflag löschen
          cin.ignore(1);
        }
      }
    
    }
    

    Und hier ein möglicher Programmablauf:

    Dieses Programm liest Zahlen ein. 0 zum Beenden
    7
    Eine Zahl wurde eingelesen. Sie lautet: 7
    46546
    Eine Zahl wurde eingelesen. Sie lautet: 46546
    g
    Etwas das keine Zahl ist, wurde eingegeben. Ignoriere ein Zeichen und versuche erneut eine Zahl zu lesen.
    45ggg678h
    Eine Zahl wurde eingelesen. Sie lautet: 45
    Etwas das keine Zahl ist, wurde eingegeben. Ignoriere ein Zeichen und versuche erneut eine Zahl zu lesen.
    Etwas das keine Zahl ist, wurde eingegeben. Ignoriere ein Zeichen und versuche erneut eine Zahl zu lesen.
    Etwas das keine Zahl ist, wurde eingegeben. Ignoriere ein Zeichen und versuche erneut eine Zahl zu lesen.
    Eine Zahl wurde eingelesen. Sie lautet: 678
    Etwas das keine Zahl ist, wurde eingegeben. Ignoriere ein Zeichen und versuche erneut eine Zahl zu lesen.
    gg0gg
    Etwas das keine Zahl ist, wurde eingegeben. Ignoriere ein Zeichen und versuche erneut eine Zahl zu lesen.
    Etwas das keine Zahl ist, wurde eingegeben. Ignoriere ein Zeichen und versuche erneut eine Zahl zu lesen.
    Eine Zahl wurde eingelesen. Sie lautet: 0
    


  • OK...habs hinbekommen...

    Aber wie kann ich zusätzlich kontrollieren, dass es sich außschließlich um ganze Zahlen handeln soll? Das ein Fehler angezeigt wird soabald jemand z.B. "3.4" eingibt.

    Mein Quelltext sieht so aus:

    #include <iostream>
    #include<cstdlib>
    #include<string>
    
    using namespace std;
    
    int main()
    {
            int x = 0, y = 0, xm = 40, ym = 20;
            int px = 0, py = 0;
            int spd = 0;
            char p;
            int i = 0;
            bool i2;
            string Eingabe;
            char* StopPos = NULL;
    
    do
    {
            x = 0;
            y = 0;
            px = 0;
            py = 0;
            spd = 0;
            i = 0;
    
            cout << "\033[2J" << flush;
            cout << "Bitte Anfangsposition eingeben!:\n";
    
            do
            {
            	i2 = false;
            	if (i != 0)
            		cout << "Fehler\n";
            	cout << "Bitte x-Position eingeben!: ";
            	cin >> Eingabe;
            	px = strtod(Eingabe.c_str(), &StopPos);
    
            	if (px < 1)
            	{
            		i2 = true;
            	}
            	else if (px>40)
            	{
            		i2 = true;
            	}
            	i++;
            }
            while (i2 == true);
    
            i = 0;
    
            do
            {
               	i2 = false;
               	if (i != 0)
              		cout << "Fehler\n";
               	cout << "Bitte y-Position eingeben!: ";
               	cin >> Eingabe;
               	py = strtod(Eingabe.c_str(), &StopPos);
    
               	if (py < 1)
               	{
               		i2 = true;
               	}
               	else if (py>20)
               	{
               		i2 = true;
               	}
               	i++;
            }
            while (i2 == true);
    
            i = 0;
    
            do
            {
               	i2 = false;
               	if (i != 0)
              		cout << "Fehler\n";
               	cout << "Wie groß soll die Geschwindigkeit sein?: ";
               	cin >> Eingabe;
               	spd = strtod(Eingabe.c_str(), &StopPos);
    
               	if (spd < 1)
               	{
               		i2 = true;
               	}
               	else if (spd>5)
               	{
               		i2 = true;
               	}
               	i++;
           }
           while (i2 == true);
    
           cout << "\033[2J" << flush;
    
            do
            {
                    cout << "\033[" << ym + 1<< ';' << x << 'H' << "-" << flush;
                    x++;
            }
            while (x != xm + 1);
    
            do
            {
                    cout << "\033[" << y << ';' << xm + 1 << 'H' << "|" << flush;
                    y++;
            }
            while (y != ym + 1);
    
            cout << "\033[" << py<< ';' << px << 'H' << "*" << flush;
            cout << "\033[" << ym + 2<< ';' << 0 << 'H' << px << " | " << py << flush;
    
            do
            {
                    usleep(200000/spd);
                    cout << "\033[" << py<< ';' << px << 'H' << " " << flush;
                    px = px + 1;
                    py = py + 1;
                    cout << "\033[" << py<< ';' << px << 'H' << "*" << flush;
                    cout << "\033[" << ym + 2<< ';' << 0 << 'H' << px << " | " << py << flush;
            }
            while(!((px == xm) || (py == ym)));
    
            cout << "\033[" << ym + 4<< ';' << 0 << 'H' << "Fertig" << flush;
            i = 0;
    
            do
            {
                    if (i != 0)
                            cout << "FEHLER!\n";
                    cout << "\033[" << ym + 5<< ';' << 0 << 'H' << "Neustarten? (y/n)" << flush;
                    cin >> p;
                    if (((p  == 'n') || (p == 'N')))
                    {
                            return 0;
                    }
                    i++;
            }
            while (!((p == 'Y') || (p == 'y') || (p == 'N') || (p == 'n')));
    }
    while ((p == 'y') || (p == 'Y'));
    
            cin.get();
            return 0;
    }
    


  • OK...hat sich erledigt...die Seite war noch nicht aktualisiert darum habe ich den neuen Beitrag nicht gelesen.

    Danke vielmals an euch...



  • OK...haut doch noch nicht ganz hin.

    Bei mir erscheint auf der Konsole folgendes in einer Endlosschleife:

    Bitte x-Position eingeben!: Fehler
    Bitte x-Position eingeben!: Fehler
    Bitte x-Position eingeben!: Fehler
    Bitte x-Position eingeben!: Fehler
    Bitte x-Position eingeben!: Fehler
    Bitte x-Position eingeben!: Fehler

    Ich sehe aber den Fehler nicht, habe es doch eigentlich genau so gemacht wie oben beschrieben.

    Mein Quelltextausschnitt:

    do
            {
            	i2 = false;
            	if (i != 0)
            		cout << "Fehler\n";
            	cout << "Bitte x-Position eingeben!: ";
            	cin >> px;
    
            	if(cin)
            	{
            		if (px < 1)
            		{
            			i2 = true;
            		}
            		else if (px>40)
            		{
            			i2 = true;
            		}
            	}
            	else
            		i2 = true;
    
            	i++;
            }
            while (i2 == true);
    

  • Mod

    Guck dir nochmal genau an, wo und wie du i und i2 verwendest. Überhaupt macht i anscheinend nichts sinnvolles. Und i2 wird in allen Fällen auf true gesetzt. Deshalb läuft die Schleife ewig.



  • "i" ist nur dazu da, dass beim zweiten Durchlauf (und natürlich auch allen nachfolgenden) "Fehler" ausgegeben wird, aber ebend nicht schon beim ersten.

    "i2" dient der Überprüfung, ob px zwischen 0 und 41 liegt. Ist dies nicht so ist "i2" true und die Schleife beginnt von vorn. In allen anderen Fällen ist "i2" false und die Schleife wird verlassen.


Log in to reply