在插入向量 C++ 之前验证用户输入

Posted

技术标签:

【中文标题】在插入向量 C++ 之前验证用户输入【英文标题】:Validating user input before inserting in a vector C++ 【发布时间】:2020-04-25 19:08:44 【问题描述】:

我正在编写一个简单的程序作为练习,用户输入成绩(char 类型),系统验证输入,将用户输入与包含成绩的向量进行比较。

我在编写检查输入是否有效、将输入转换为大写然后将输入插入向量的逻辑时遇到问题。如果用户没有输入有效字符并再次询问有效输入,我希望程序回到循环的开头。现在程序验证输入并发送消息“请输入有效成绩”,但将输入插入向量中,无论它是对还是错。这不是我们想要的结果。

我刚开始学习 c++,很抱歉代码乱七八糟。

这是获取用户输入、转换为大写并针对向量进行验证的函数。

void gradesInput() 
    char upperGrade;
    bool result = true;

    for (size_t i = 0; i < dGrades.size() && result == true; i++)
    

            cout << "Please enter your student grades...\n";
            cin >> dGrades[i];
            upperGrade = toupper(dGrades[i]);
            result = validateInput(upperGrade);
            if (result == true)
                cout << "That's a valid grade.";
            
            else 
                cout << "Please enter a valid grade.";
            
    


这是运行验证的函数:

bool validateInput(char uInput) 
    vector <char> grades(arr, arr + sizeof(arr) / sizeof(arr[0]));
    bool result = binary_search(grades.begin(), grades.end(), uInput);

    return result;

这是我正在使用的向量和数组声明:

std::vector <char> dGrades(10);
static const char arr[] =  'A', 'B', 'C', 'D', 'F' ;

在将输入与数组进行比较并转换为大写之后,我将用户输入插入到 dGrades 向量中。

感谢您的帮助或任何指导。

【问题讨论】:

使用其他循环结构,例如whiledo-while,您可以在其中增加索引而不是自动增加索引。 ...并使用temp 读取用户输入,仅在有效时插入。除此之外,您似乎拥有所有零件,只是顺序错误 如果您将arr 声明为const array&lt;char, 5&gt;,则可以摆脱validateInput()vector&lt;char&gt; 的创建。 std::array 类有 begin()end() 方法。 【参考方案1】:

您希望循环直到用户在高级别请求输入的 10 次中的每一次都输入了有效值。因此,在 for 循环的每次迭代中,您都希望循环直到用户提供有效输入。只有这样你才能推入向量。一旦找到有效输入,我建议您将其添加为返回 char 的函数:

char getValidGrade() 
    char result;
    while (true) 
        cout << "Please enter your student grades...\n";
        cin >> result;
        result = toupper(result);
        if (validateInput(result)) 
            cout << "That's a valid grade.";
            return result;
        
        else 
            cout << "Please enter a valid grade.";
        
    

像这样在gradesInput() 中调用它:

void gradesInput() 
    for (auto &grade : dGrades) 
        grade = getValidGrade();
    

【讨论】:

谢谢!这就像一个魅力。我已经两天试图解决这个简单的问题。

以上是关于在插入向量 C++ 之前验证用户输入的主要内容,如果未能解决你的问题,请参考以下文章

我想通过在 C++ 中使用向量来获取用户输入,但我得到了无限循环

在 C++ 中验证来自用户的整数输入

如何在 C++ 中将用户输入验证为双精度?

在用户插入数据之前创建结构对象时,Vector 返回乱码

代码失败在向量数据前插入数字

在向量循环 C++ 中终止字符串输入