用 C++ 验证用户输入

Jinku Hu 2023年1月30日 2021年1月4日
  1. 使用 cincin.clearcin.ignore 方法来验证用户输入
  2. 使用自定义函数来验证用户的输入
用 C++ 验证用户输入

本文将演示关于如何在 C++ 中验证用户输入的多种方法。

使用 cincin.clearcin.ignore 方法来验证用户输入

这个例子的重点是一个健壮的用户输入验证方法,这意味着它应该满足基本的错误检查要求,即使输入的类型是错误的,也要继续执行。

实现这个功能的第一个构造是 while 循环,我们要在一个条件中指定 true。这个迭代将保证循环行为,直到正确的值被存储在一个变量中。在循环内部,一个 if 语句会评估 cin >> var 表达式,因为插入操作成功后,返回值为正。一旦正确地存储了值,我们就可以退出循环;否则,如果 cin 表达式没有成功,执行就会进入 cin.clear 调用,在意外输入后取消设置 failbit。接下来,我们跳过输入缓冲区中剩余的字符,进入下一次迭代询问用户。

#include <iostream>
#include <sstream>
#include <limits>
#include <vector>

using std::string; using std::vector;
using std::cout; using std::endl;
using std::cin; using std::numeric_limits;

int main()
{
    int age;

    while (true) {
        cout << "Enter the age of the wine: ";
        if (cin >> age) {
            break;
        } else {
            cout << "Enter a valid integer value!\n";
            cin.clear();
            cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
        }
    }

    return EXIT_SUCCESS;
}

输出:

Enter the age of the wine: 32

使用自定义函数来验证用户的输入

以前的方法即使对于几个输入变量也是相当麻烦的,而且多个 while 循环会浪费代码空间。因此,应将子程序概括为一个函数。validateInput 是函数模板,它接收变量的引用并返回成功存储的值。

注意,即使我们需要实现一个 100 道题的测验,这个方法也能保证比之前的版本产生的代码干净得多。

#include <iostream>
#include <sstream>
#include <limits>
#include <vector>

using std::string; using std::vector;
using std::cout; using std::endl;
using std::cin; using std::numeric_limits;

template<typename T>
T &validateInput(T &val)
{
    while (true) {
        cout << "Enter the age of the wine: ";
        if (cin >> val) {
            break;
        } else {
            cout << "Enter a valid integer value!\n";
            cin.clear();
            cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
        }
    }
    return val;
}

int main()
{
    int age;
    int volume;
    int price;

    age = validateInput(age);
    volume = validateInput(volume);
    price = validateInput(price);

    cout << "\nYour order's in!\n" << age << " years old Cabernet"
         << " in " << volume << "ml bottle\nPrice: " << price << "$\n";

    return EXIT_SUCCESS;
}

输出:

Enter the age of the wine: 13
Enter the volume of the wine in milliliters: 450
Enter the price of the bottle: 149

Your order's in!
13 years old Cabernet in 450ml bottle
Price: 149$
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相关文章 - C++ IO