PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++]int



buchwaldj
17-08-2003, 15:11
ich habe eine Mehrseitige Auswahl(switch) für die die Variable den Typ int hat.
wenn ich nun ausversehen ein Buchstaben eigebe, wird aus dem schönen Programm eine endlosschleife. Wie kann ich prüfen (mit case) ob für die Variable des Typs int ein Buchstabe eingegeben wurde?

wraith
17-08-2003, 15:28
Wenn du über cin in einen int einen Buchstaben einliest,dann kommt der Stream in einen Fehlerzustand,daher dann die Endlosschleife.
So weißt du dann aber,ob etwas != Zahl eingegeben wurde.


#include <iostream>
#include <limits>

using namespace std;

int main()
{
int auswahl;
while(true)
{
if(!(cin >> auswahl))
{
cin.clear(),cin.ignore(numeric_limits<std::streamsize>::max(),'\n');
cout << "Keine Zahl" << endl;
}
else
switch(auswahl)
{
case 1:
case 2:/*blabla... */
cout << "Zahl" << endl;
break;
}
}
}


Aber sicher,daß deine switch sich nicht auch schöner schreiben läßt,vielleicht mit einer Jumptabelle,oder Map oder std::vector.
Wenn du mehr als 256 Einträge in der switch hast,kann es eng werden.

buchwaldj
17-08-2003, 17:27
Bei mir scheint mein kompiler die "limits" -headerdatei nicht zu finden.
Und "limits.h" scheint die Funktion nicht zu kennen.
Vieleicht kann mir ja jemand die "limits"-header datei geben, damit ich sie direkt zu den Sourcen nehmen kann.

wraith
17-08-2003, 17:37
Ist dein Compiler so alt?
Naja,ersetze einfach die Zeile durch


cin.clear(),cin.ignore(100,'\n');

Da wo 100 steht kannst du auch eine andere große Zahl einsetzen,aber 100 müßte reichen.
Und dann natürlich kein limits includen.

cybercrow
17-08-2003, 17:58
Original geschrieben von buchwaldj
Bei mir scheint mein kompiler die "limits" -headerdatei nicht zu finden.
Und "limits.h" scheint die Funktion nicht zu kennen.
Vieleicht kann mir ja jemand die "limits"-header datei geben, damit ich sie direkt zu den Sourcen nehmen kann.

das liegt am gcc, gcc2.X kennt diese header noch nicht ab gcc3.x sollte es funktionieren.

buchwaldj
18-08-2003, 21:47
neeeiiinn und ich hab mir fest vorgenommen nicht zu wechseln.
Vileicht kann mir ja jemand den header das Header file schicken?
Da bette ich es in mein Prog so ein.

Berufspenner
18-08-2003, 22:11
neeeiiinn und ich hab mir fest vorgenommen nicht zu wechseln. Rein aus Neugierde: Warum denn nicht?

Cu
André

guardian
18-08-2003, 22:12
EDIT: Sorry hab was überlesen ... war beim 2ten mal lesen völliger Schwachsinn :)
Einfach ignorieren ;)

So long ...

cybercrow
18-08-2003, 22:17
Original geschrieben von Berufspenner
Rein aus Neugierde: Warum denn nicht?


würde mich auch interessieren. Vorallem, weil heute eigentlich jede Distribution auch schon einen gcc aus der 3.x Generation mit dabei hat und für C++ ist der gcc3.x imho auf jedenfall erste Wahl!

buchwaldj
19-08-2003, 22:24
Man hört eigentlich aus aller Richtung das es nicht geraten ist auf den gcc 3.2.x zu wechseln,da besonders die Abwärtskompatibilitatät nicht gewärleistet sein soll.
Vieleicht mache ich mich auch sinnlos von anderen verrückt aber es wurde ja auch von den führenden Linuxzeitschriften kritisiert, das die meisten Distributionen auf den gcc 3.2
umgestiegen sind.

Berufspenner
19-08-2003, 22:34
Hi@all

Du kannst doch auch mehrere CGG Versionen paralel auf einem System laufen lassen und außerdem finde ich, dass um die inkompatibilität zu "älteren" Programmen ganz schön viel Wind gemacht wird.

Cu
André

cybercrow
20-08-2003, 00:03
@buchwaldj: Sehe das ähnlich wie Berufspenner.
Die Kritik an den Distributionen war eigentlich aus der Zeit des gcc3.0 - gcc3.1x, da hatte der gcc3 noch viele Fehler und es wurde noch viel geändert. Mittlerweile hat der gcc aber eine solide Basis erreicht. Das mit der Kompatibilität ist nur ein Problem bei größeren Projekten, du kannst z.B. nicht Teile von KDE mit dem gcc2.x und andere mit dem gcc3.x kompilieren, weil sie eben nicht binär Kompatibel sind. Deshalb müssen Distributionen auf einen Schlag umsteigen und können den gcc3 nicht schleichend einführen. Für eigene C++ Projekte würde ich aber immer den gcc3.x verwenden, da ist es auch nicht problematisch wenn dein System noch auf dem gcc2.x basiert weil dein Programm ja eine selbstständige Einheit bildet.