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.


Anmelden zum Antworten