Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Endlosschleife

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.11.2006, 20:49 Uhr
~Sancho
Gast


Hallo zusammen,

ich frage mich warum dieses bisschen Code zu einer Endlosschleife führt, wenn man im Dialog einen beliebigen Buchstaben eingibt.
Das Programm geht in die default-Anweisung und danach wird wieder dieselbe Methode aufgerufen.
Anscheinend bleibt aber der Wert für "input" gespeichert. Aber warum? Die Variable wird doch neu angelegt, wenn die Methode neu gestartet wird.

void LinkedList::showMenu()
{

cout << "Menu" << endl;
cout << "----------" << endl;
cout << "1. Liste zeigen" << endl;
cout << "2. Element zeigen" << endl;
cout << "3. Element hinzufuegen" << endl;
cout << "4. Element loeschen" << endl;
cout << "5. Beenden" << endl;
cout << endl;


int input;
cin >> input;

switch (input)
{
case 1: cout << endl; showList(); break;
case 2: cout << endl; break;
case 3: cout << endl; addElement(); break;
case 4: cout << endl; removeElement(); break;
case 5: exit(0); break;
default:
cout << "Falsche Eingabe (" << input <<")" << endl; break;

}

l->showMenu();

}


void main ()
{

l = new LinkedList();

l->showMenu();


}


Gruß Sancho
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.11.2006, 21:45 Uhr
xXx
Devil


Das ganze formatiert

C++:
int _tmain(int, _TCHAR**)
{
    LinkedList list;
    list.showMenu();

    return 0;
}

void LinkedList::showMenu(void)
{
    std::cout << "Menu" << std::endl;
    std::cout << "----------" << std::endl;
    std::cout << "1. Liste zeigen" << std::endl;
    std::cout << "2. Element zeigen" << std::endl;
    std::cout << "3. Element hinzufuegen" << std::endl;
    std::cout << "4. Element loeschen" << std::endl;
    std::cout << "5. Beenden" << std::endl;
    std::cout << std::endl;
    
    unsigned int nInput    = 5;
    std::cin >> nInput;

    switch (nInput)
    {
    case 1:
        {
            std::cout << std::endl;
            showList();
        } break;
    case 2:
        {
            std::cout << std::endl;
        } break;
    case 3:
        {
            std::cout << std::endl;
            addElement();
        } break;
    case 4:
        {
            std::cout << std::endl;
            removeElement();
        } break;
    case 5:
        {
            exit(0);
        } break;
    default:
        std::cout << "Falsche Eingabe (" << nInput <<")" << std::endl;
        break;
    }
    showMenu();
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.11.2006, 22:20 Uhr
~Sancho
Gast


Ich bin schon etwas weiter gekommen.

Jetzt müßte ich nur noch wissen wie ich folgendes abfange:


C++:

int a;
cin >> a;




und dann gebe ich einen Buchstaben ein.
In Java gäbe es ja eine NumberFormatException... wie ist das in C++ ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.11.2006, 23:14 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


du fragst cin ob der schrott eingelesen hat... Wenn ja dann ist a nicht zu gebrauchen wenn nein dann hats gefunzt
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.11.2006, 10:54 Uhr
~Sancho
Gast



C++:
cin >> input;
        
    while (input < 1 || input > 5)
    {
        cout << "Falsche Eingabe, bitte nochmal:" << endl;
        cin >> input;
            if (cin.fail()) //liefert true bei Fehlern
        {
            cin.clear(); //löscht Fehlerflags, die bei unerwarteten Eingaben gesetzt werden
            char c;
            cin >> c;
            
        }
    }



Das ist jetzt leicht aus der MSDN kopiert, aber so funzt es
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.11.2006, 16:52 Uhr
0xdeadbeef
Gott
(Operator)



Zitat von xXx:


C++:
int _tmain(int, _TCHAR**)



...das verbitte ich mir 1. sowieso und 2. zumindest im ANSI-C++-Forum.

C++:
int main(int argc, char *argv[]);


...soviel Standard muss sein

Ansonsten,

Zitat von ~Sancho:


C++:
case 5: exit(0); break;




exit() ist in C++ unter keinen Umständen zu benutzen. Der Hintergrund ist, dass das Programm dadurch sofort beendet wird, ohne vorhandene Objekte ordnungsgemäß zu zerstören. Wenn du unbedingt eine solche Funktionalität brauchst - und ich halte das an dieser Stelle eh für einen Designfehler - schmeiß eine exception, die nicht gefangen werden kann/soll.

Was das eigentliche Problem angeht, sobald ein Buchstabe im Stream steht, schlägt das einlesen von Zahlen verständlicherweise fehl - man kann sich das ein bisschen wie Streamtrombose vorstellen. Bei Usereingaben sinnvoll ist daher häufig eine gebufferte Eingabebehandlung, ie zeilenweises Einlesen. Das sieht dann in der Praxis so aus:

C++:
#include <iostream>
#include <sstream>
#include <string>

// ...

int read_int(std::string const &prompt) {
  std::istringstream isstr;
  std::string line;
  int x;

  do {
    std::cout << prompt << std::flush;
    std::getline(std::cin, line);
    isstr.clear();
    isstr.str(line);
    isstr >> x;
  } while(!isstr);

  return x;
}

// ...

int x = read_int("Zahl eingeben: ");


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 22.11.2006 um 16:53 Uhr von 0xdeadbeef editiert.
 
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: