C++ C++;用户输入验证工作不正常

C++ C++;用户输入验证工作不正常,c++,validation,C++,Validation,我有一段代码,要求输入一个数字并将其存储在一个变量中。我试图对输入进行验证,但它的行为很奇怪 #include <iostream> using namespace std; float coursework_mark; float exam_mark; float module_mark; int main() { //COURSEWORK INPUT WITH VALIDATION cout << "Please enter your cours

我有一段代码,要求输入一个数字并将其存储在一个变量中。我试图对输入进行验证,但它的行为很奇怪

#include <iostream>
using namespace std;

float coursework_mark;
float exam_mark;
float module_mark;

int main() {

    //COURSEWORK INPUT WITH VALIDATION
    cout << "Please enter your coursework mark: ";
    while(!(cin >> coursework_mark)){
        cin.clear();
        cin.ignore(1000, '\n');
        cout << "Invalid data type, please enter valid coursework mark: ";
    }
    while (coursework_mark < 0 || coursework_mark > 100) {
        cout << "Out of range, please enter valid coursework mark: ";
        cin >> coursework_mark;
    }

    //EXAM MARK INPUT WITH VALIDATION
    cout << "Please enter your exam mark: ";
    while(!(cin >> exam_mark)) {
        cin.clear();
        cin.ignore(1000, '\n');
        cout << "Invalid data type, please enter valid exam mark: ";
    }
    while (exam_mark < 0 || exam_mark > 100) {
        cout << "Out of range, please enter valid exam mark: ";
        cin >> exam_mark;
    }

    //Coursework capping
    if (coursework_mark > exam_mark * 2) { coursework_mark = exam_mark * 2;}

    //Calculate Module mark
    module_mark = (coursework_mark* 0.4) + (exam_mark* 0.6);

    //Output results
    cout << coursework_mark << endl;
    cout << "Your module mark is " << module_mark << endl;
    if (module_mark >= 50) {
        cout << "Congratulations you have passed!" << endl;
    } else if (module_mark < 50) {
        cout << "Unfortunately, you have not passed" << endl;
    }


}
#包括
使用名称空间std;
浮动课程分数;
浮动考试分数;
浮子模块标记;
int main(){
//带验证的课程作业输入
课程作业(分数){
cin.clear();
cin.忽略(1000,“\n”);
库特(100){
课程成绩;
}
//带验证的考试分数输入
考试(分数){
cin.clear();
cin.忽略(1000,“\n”);
库特(100){
考分;
}
//课程封顶
如果(作业分数>考试分数*2){coursework分数=考试分数*2;}
//计算模块标记
模块分数=(课程分数*0.4)+(考试分数*0.6);
//输出结果
不能而不是

while(!(cin >> coursework_mark)){
您应该使用
std::getline

这个方法是我发现的检查字符串是否包含数字的最简单的方法。因此,如果它返回true,字符串只包含数字,否则它包含的不仅仅是数字


如果声明为假,则可以像上面所做的那样清除cin。

请将代码减少到仅导致问题的部分,请参阅。顺便说一句,您应该从计算中指定IO,使用函数作为模块化。最后一个
else If
可以是
else
std::getline(std::cin, coursework_mark);
bool has_only_digits(string s){
return s.find_first_not_of( "0123456789" ) == string::npos;}