用 C++ 验证用户输入

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

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

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

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

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

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

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

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 <limits>
#include <sstream>
#include <vector>

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

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$
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C++ IO