Was machen, wenn der User für eine "int-Eingabe" etwas anderes eingibt?

Nord-Süd-Richtung

Erfahrenes Mitglied
Hi Com!
Ich schreibe zZ. eine Konsolenanwendung. Ich stehe gerade vor dem Problem, das der User in der Versuchung stehen könnte eine falsche Eingabe zu tätigen (oder Ausversehen :D )
Ich habe eine int x Variable, die ich per cin>> einlese. Anschließend überprüfe ich die Eingabe mit switch.
Der User kann 1,2 und 3 eingeben. Wenn er z.B. aber 4 eingibt, habe ich bei switch ja den default case, der das dann richtig hinbiegt.
Nur wenn der User Buchstaben oder Floats eingibt, dann spinnt das Programm :(
Code:
do
{
//User Eingabe
//switch
}
while (goon == 1) //goon wird im default case auf 1 gesetzt.
So ungefähr sieht mein Code aus :)
Ich habe es schon mit if(typeof(x) != int) versucht, aber ich erhielt nur eine Fehlermeldung, die ich nicht zu verstehen vermag :(
Please help me :)
 
Hi

C++:
if (cin >> x)
{
  // code
}
else
{
  // Fehlermeldung usw.
}
Wird ein falscher "Datentyp" eingetippt, so werden bestimmte Fehlerflags gesetzt, welche man wieder zurücksetzen müsste, sofern das Programm weiter arbeiten soll.

mfg :)
 
Du kannst bei Switch einen default festlegen:
C++:
#include <iostream>
using namespace std;

int main() {
  int x = 0;
  bool neu = false;

  cout << "Bitte tätigen sie eine Eingabe\n";
  
  do {
    neu = false;

    cin >> x;
    switch (x) {
      case 1:
          //was auch immer
          break;
      case 2:
          //was auch immer
          break;
      case 3:
          //was auch immer
          break;
      default:
          cout << "Falsche Eingabe, bitte geben sie nur 1, 2, oder 3 ein\n"
          neu = true;
    }
  }while(neu);
}

EDIT: habe wohl oben überlesen, dass du sagst es spinnt, also welche IDE und welchen Compiler benutzt du denn? Nicht zufällig Dev-Cpp ? :D
denn normal würde ein char auch nur als int erkannt (man siehe ASCII-Tabelle), und bei einem float alles hinter dem Dezimalpunkt ignoriert
 
Zuletzt bearbeitet von einem Moderator:
Hi,

jepp es ist der Dev-Cpp :D
Ich habe es jetzt mal so probiert, aber es scheint nicht ganz zu klappen :(
Bei floats wird wirklich nur die Zahl vor dem . genommen,
aber sobald ich die 2Mrd Zahl überschreite, einen string (1 char geht :) ) oder ein Sonderzeichen nehme, schmiert das Programm ab.
C++:
#include<iostream>

using namespace std;

int main()
{
    int repeat;
    int ch1;
    do
    {
          system("cls");
          repeat = 1;
          cout<<"[1]Spiel beginnen\n";
          cout<<"[2]Spiel laden\n";
          cout<<"[3]Spiel loeschen\n";
          if (cin>>ch1)
          {
                       repeat = 0;
                       switch (ch1)
                       {
                              case 1://Spiel beginnen
                                   void begingame();
                                   break;
                              case 2://Spiel laden
                                   void loadgame();
                                   break;
                              case 3://Spiel loeschen
                                   void delgame();
                                   break;
                              default://Falsche Eingabe
                                   repeat = 1;
                                   break;
                       }
          }       
          else
          {   
              ch1 = 0;
          }
          cout<<"Bitte taetigen Sie eine richtige Eingabe"<<endl;
    }
    while (repeat == 1);
    system("PAUSE");
    return 0;
}
Ich habe es schon (wie man sehen kann) probiert, bei einer falschen Eingabe einfach ch1 zu ändern, aber es wird trotzdem eine Endlosschleife durchgeführt :(
 
Gibt es denn keine Max. Werteschwelle im Game Wenn ja dann mach einfach ne Überprüfung. Oder als einfach die Eingabe in einen Integer umwandeln. Integerwerte gehen nur bis 65536, reicht eigenlich schon aus nur die Überprüfung als Integer, solltest du schon machen ;)
 
Hi
Auf welchem System arbeitest du denn denn bezüglich deiner 16-bit-ints :)
Also ich denk eher, wir haben es hier mit einem 32er tu tun, da gehts exakt von 0
bis 4294967295
Gruß
 
Was meinst du mit einer max. Werteschwelle? :confused:
Wie überprüfe ich denn, ob es sich um einen Integerwert handelt?
Wie gesagt, mit typeof kam ich nicht so ganz zurecht :(
 
Im anderen Thread hab ich dazu schon eine einfache Funktion gepostet:
C++:
template<typename input_type>
std::istream& type(std::istream& in, std::string const& prompt, input_type& input)
{
    while (std::cout << prompt << std::flush && !in >> input)
    {
        std::cout << "Falsche Eingabe!" << std::endl;
        in.clear(); in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    return in;
}
... Es wird der Wert von prompt ausgegeben, dann versucht in input den Wert einzulesen. Wenn das nicht klappt wird "Falsche EIngabe!" ausgegeben. Dann der Stream zurück gesetzt und alles rausgeschmissen was noch drin ist. Das geht solange bis das Einlesen erfolgt hatte.

=>
C++:
#include <iostream>
#include <cstdio>
#include <string>
#include <limits>

template<typename input_type>
std::istream& type(std::istream& in, std::string const& prompt, input_type& input)
{
    while (std::cout << prompt << std::flush && !in >> input)
    {
        std::cout << "Falsche Eingabe!" << std::endl;
        in.clear(); in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    return in;
}

const unsigned char menu()
{
    unsigned char input(0);
    while (input < 1 || input > 3) // nur 1 ... 3 ist etwas zugewiesen!
    {
        std::system("cls");
        std::cout    << "[1]Spiel beginnen\n"
                    << "[2]Spiel laden\n"
                    << "[3]Spiel loeschen" << std::endl;

        type(std::cin, "Auswahl: ", input);
    }
    return input;
}

int main()
{
    const unsigned char auswahl(menu());

    switch (menu())
    {
    case 1: //Spiel beginnen
        begin_game();
        break;
    case 2: //Spiel laden
        load_game();
        break;
    case 3: //Spiel loeschen
        delete_game();

    }
    std::cin.get();
}
 
Zurück