[C++] Kolla så att man inte råkat mata in ett tecken då ett tal ska matas in

Permalänk
Medlem

[C++] Kolla så att man inte råkat mata in ett tecken då ett tal ska matas in

Jag vill gärna veta hur jag kan se till så att en variabel enbart får ett flyttal eller heltal inmatat. Om man råkar mata in ett tecken eller flera tecken så ska man få möjligheten att mata in de korrekta siffrorna igen.

Här kommer en liten kodsnutt som inte fungerar. Men jag hoppas ni förstår vad jag menar med den.

while (meny) { if(x==float || int) break; else { cout << "Du matade in ett tecken. Du måste ange ett tal: " cin >> x; break; } }

Jag vill helt enkelt att if ska kolla om float eller int är siffror och inte tecken.

Visa signatur
Permalänk
Medlem

"Isnumeric" är det du söker. Men eftersom det saknas i C++ så får vi göra det jobbigt.
#include <cctype>
isdigit() är din vän sen.

http://msdn2.microsoft.com/en-us/library/f9xkk9fk(VS.80).aspx

Permalänk
Medlem

Tack, men den verkar inte kunna hantera float. Jag vill att den ska känna igen både heltal och flyttal.

Visa signatur
Permalänk
Medlem

float var; while(!(cin >> var)) { cout << "Felaktigt, försök igen" << endl; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(),'\n'); }

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem

while (meny) { if(!cin) break; else { cout << "Du matade in ett tecken. Du måste ange ett tal: " cin >> x; break; } }

Permalänk
Medlem

float read_float_or_int() { float f; while (true) { cout << "Enter ONE float or int: "; cin >> f; if (cin.bad()) { cerr << "Input stream broken beyond repair, exititing program..." << endl; // do whatever to exit, I suggest an exception not calling exit() } else if (!cin.good() || cin.peek() != '\n') { cerr << "Invalid or too much input." << endl; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n') } else { return f; } } }

Inkludera <limits> för numeric_limits...om du vill tillåta för mycket input är upp till dig...att hantera cin.bad() också frivilligt, det händer i princip aldrig...

Permalänk
Medlem

Tack för alla svaren. MagnusL's exempel verkar fungera bäst för mig.

Visa signatur