do() while variabeln überprüfung
-
hi
ich habe einen input per cin. diesen will ich überprüfen ob er eine positive zahl ist, und keine negative, null oder alphabetisch.
dies mache ich so:
cout << "Enter T, the temperture for which Cv is to be calculated\n"; do{cin >> T;}while(!checkinput("neg",T)); ///////// int checkinput(string type, float value){ //check if value is negative (if a string eg 'hello' is entered, the value becoms negative too) if(type=="neg" && value<=0){ cout << "ERROR: invalid input. Try again\n"; return 0; }else if(type=="gas" && (value < 8.31 || value > 8.32)){ cout << "ERROR: invalid input. Try again\n"; return 0; }else{ return 1; } }das funktioniert auch super solange man zahlen eingibt. auch bei eingabe 0 (=null) geht es gut. sobald ich aber einen buchstaben eingebe, kommt er in eine schlaufe rein. vielleicht noch zu sagen, T ist ein float.
an was kann das liegen?
-
Du musst einfach diesen Fall abfangen:
std::istream& clear_stream(std::istream& in) { in.clear(); in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); return in; } // ... do { std::cout << Enter T, the temperature for which Cv is to be calculated" << std::endl; } while (!(clear_stream >> T) || valid_input("neg", T) == false); // ... bool valid_input(std::string const& type, float value) { return !((type == "neg" && value <= 0.0f) || (type == "gas" && (value < 8.31f || value > 8.32f))); }Das wichtige ist, dass du guckst ob nen fail/bad-bit im Eingabestream gesetzt ist und das du gegebenen Falls da wieder aufräumst (clear_stream).
-
http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.3
Übrigens kannst du hier eine einfache while-Schleife statt do-while benutzen.