wie um zu überprüfen, ob die Benutzereingabe einer Ganzzahl
Ich zu meinem Programm, wenn der Benutzer Eingaben eine ganze Zahl und nicht ein Zeichen oder string.
Charakter ist nicht so schlimm, da es pratically eine ganze Zahl, aber wenn der Benutzer eine Folge von Zeichen, dann geht es einfach Nüsse.
Ich habe diese Funktion
int* ask_lung(int* lung)
{
int tmp; //length of a word
cout << "Inserisci la lunghezza della parola da indovinare: ";
cin >> tmp;
if(cin)
{
//Se i è uguale a o minore di 0 allora ritorna all'inizio
if(tmp <= 0)
{
cout << endl << "\tNon puoi inserire 0." << endl << endl;
ask_lung(lung);
}
else
{
//the error is about here, when it reaches this part of the code it keeps showing the first line "Inserisci la lunghezza della parola da indovinare: "
*lung = tmp;
}
}
else ask_lung(lung);
return lung;
}
Was bedeutet das tun/tun sollen ?
while( ! (cin >> myInt)){ std::cout << "Ihre Eingabe war nicht ein "int" << std::endl } Oder verstehe ich etwas falsch?!
wenn tmp ist <= 0 oder ein Zeichen oder eine Zeichenfolge sollte es drucken ein Fehler und bitten nochmals für den input
Warum es nicht in der Schleife, statt es rekursiv? I. e.
mit einer while-Schleife, nur es hält zeigt die Fehler, die ich bin Eingebung, wie wenn der Benutzer hält die Eingabe falsch
while( ! (cin >> myInt)){ std::cout << "Ihre Eingabe war nicht ein "int" << std::endl } Oder verstehe ich etwas falsch?!
wenn tmp ist <= 0 oder ein Zeichen oder eine Zeichenfolge sollte es drucken ein Fehler und bitten nochmals für den input
Warum es nicht in der Schleife, statt es rekursiv? I. e.
while (!(cin >> tmp)) { /* Prompt user to enter a proper number */ }
. Auch, wenn Sie nicht wollen, dass die Zahl negativ sein, erklären tmp
zu unsigned
.mit einer while-Schleife, nur es hält zeigt die Fehler, die ich bin Eingebung, wie wenn der Benutzer hält die Eingabe falsch
InformationsquelleAutor DomeWTF | 2012-11-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Falle der Zeichenfolge, Ihr stream enthält eine große Anzahl von ungültigen Zeichen, und Sie müssen Spülen Sie den Strom von diesen Zeichen zu einem neuen Zustand. Anstatt das zu tun, rekursiv, es ist besser zu tun, die in einer Schleife. Dies würde ausreichen, um Sie vernünftig.
können Sie mir erklären bitte cin.ignore(std::numeric_limits<streamsize>:: max(), '\n'); ?
Müssen wir den Fall behandeln, der
12x<enter>
wo der erste Teil ist ein integer, dann gibt es einige Müll auf der Leitung?Wenn Sie ein ungültiges Zeichen, die keine Ganzzahl ist, setzt es den schlechten schlecht (dies ist, warum Sie benötigen, rufen Sie clear()). Aber es entfernt nicht die schlechten Zeichen aus dem stream, also wenn du loop wird es immer wieder versuchen und Lesen der schlechte Charakter. Also die ignore () - Aufrufe, liest und löscht alle Zeichen bis zum neue-Zeile-Zeichen ('\n').
InformationsquelleAutor Coding Mash
Können Sie
std::all_of
zusammen mitstd::isdigit
:Oder, wenn Sie wollen, um zu testen und wollen auch die ganze Zahl ist, dann ist es besser, zu verwenden
input
alsint
, wie vorgeschlagen, die von anderen beantworten. Sie können überlegenstd::stoi
wenn Sie (Lesen Sie) den string schon. Beachten Sie, dassstd::es ist
wirft exception im Fehlerfall.ist keine ganze Zahl.
Upps. Behoben. 🙂
InformationsquelleAutor Nawaz
Die Eingabe wird korrekt verarbeitet, das problem ist, dass Sie die Rückgabe einen Zeiger auf eine lokale variable. Diese variable wird auf dem stack, wird es freigegeben, sobald die Funktion zurückkehrt. Stattdessen sollten Sie einfach nur wieder die ganze Zahl selbst, nicht einen Zeiger darauf.
EDIT: ich sehe, dass Sie eigentlich nicht wieder einen Zeiger auf die integer -, die Sie zuweisen, um die ganze Zahl, die der Zeiger zeigt. Dennoch ist es besser, nur die Rückkehr der integer selbst.
*lung = tmp
ändert sich der Wert verweistlung
, nicht seine Adresse. Eingabe ist nicht korrekt behandelt.InformationsquelleAutor user1610015