
Benutzer1426900
Hier ist der Code
double enter_number()
{
double number;
while(1)
{
cin>>number;
if(cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input " << endl;
}
else
break;
cout<<"Try again"<<endl;
}
return number;
}
Mein Problem ist, dass, wenn ich so etwas wie 1x eingebe, dann 1 als Eingabe genommen wird, ohne das Zeichen zu bemerken, das für einen weiteren Lauf ausgelassen wird. Gibt es eine Möglichkeit, es mit einer reellen Zahl, zB 1,8, zum Laufen zu bringen?
Wenn cin auf eine Eingabe trifft, die es nicht richtig in die angegebene Variable einlesen kann (z. B. die Eingabe eines Zeichens in eine Integer-Variable), geht es in einen Fehlerzustand und lässt die Eingabe in seinem Puffer.
Sie müssen mehrere Dinge tun, um dieses Szenario richtig zu handhaben.
- Sie müssen diesen Fehlerzustand testen.
- Sie müssen den Fehlerstatus löschen.
- Sie müssen entweder die Eingabedaten behandeln, die den Fehlerzustand generiert haben, oder sie löschen und den Benutzer erneut auffordern.
Der folgende Code stellt eine von zahlreichen Methoden bereit, um diese drei Dinge zu tun.
#include<iostream>
#include<limits>
using namespace std;
int main()
{
cout << "Enter an int: ";
int x = 0;
while(!(cin >> x)){
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input. Try again: ";
}
cout << "You enterd: " << x << endl;
}
Sie könnten einfach einen großen Wert wie 1000 an cin.ignore übergeben, und es verhält sich wahrscheinlich für alle praktischen Zwecke genau gleich.
Sie können cin auch nach dem Eingabeversuch testen und so behandeln, etwa if(!cin){//clean up the error} .
Sehen Sie sich die istream-Referenz für andere Member-Funktionen an, um den Stream-Status zu verarbeiten: http://cplusplus.com/reference/iostream/istream/

Jess Gut
ich würde … benutzen std::getline
und std::string
die ganze Zeile zu lesen und erst dann aus der Schleife auszubrechen, wenn Sie die ganze Zeile in ein Double umwandeln können.
#include <string>
#include <sstream>
int main()
{
std::string line;
double d;
while (std::getline(std::cin, line))
{
std::stringstream ss(line);
if (ss >> d)
{
if (ss.eof())
{ // Success
break;
}
}
std::cout << "Error!" << std::endl;
}
std::cout << "Finally: " << d << std::endl;
}
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int get_int(void);
int main()
{
puts("Enter a number");
cout<<"The integer is "<<get_int()<<endl;
return 0;
}
int get_int(void)
{
char str[20];
char* end;
int num;
do{
fgets(str,20,stdin);
str[strlen(str)-1]='\0';
num=strtol(str,&end,10);
if(!(*end))
return num;
else
{
puts("Please enter a valid integer");
num=0;
}
}while(num==0);
}
Dies funktioniert gut für jede ganze Zahl. Es kann sogar prüfen, ob Sie nach der Ganzzahl ein Leerzeichen oder ein anderes Zeichen eingeben. Das einzige Problem ist, dass es nicht verwendet wird std::cin
. Aber das Problem mit std::cin
ist, dass es jedes Leerzeichen nach der Ganzzahl ignoriert und die Ganzzahl gerne als Eingabe nimmt.
9930900cookie-checkWie man Cin dazu bringt, nur Zahlen zu nehmenyes
Alles in einen String einlesen und die Eingabe entsprechend parsen?
– Rhexis
31. Mai 2012 um 7:09 Uhr
cin.get() verwenden und dann auf EOF-Zeichen prüfen?
– Ansar
31. Mai 2012 um 7:18 Uhr