正确数据类型的输入验证
Input validation for correct datatype?
以下是我彼此相邻使用的两个循环结构来验证整数和字符输入,一个接一个:
while (((std::cout << "Enter Strength stat: ") && !(std::cin >> STR)) || ((STR > 20) || (STR < 0)))
{
std::cout << inval;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
}
while (((std::cout << "Use characters 'Y' or 'N' to confirm. ") && !(std::cin >> confirm_Y_N)) || ((confirm_Y_N != 'Y') && (confirm_Y_N != 'N')))
{
std::cout << inval;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
}
它一直适用于任何类型的不匹配输入,直到我的手滑倒并且我输入"1-"作为整数值。
这是我输入任何以预期数据类型开头的内容,然后跟上任何其他数据类型时得到的输出:
Enter Strength stat: 1-
Use characters 'Y' or 'N' to confirm. Invalid value! Use characters 'Y' or 'N' to confirm. Y-
Enter Dexterity stat: Invalid value! Enter Dexterity stat:
如您所见,它完全跳过了 while 循环的一个接一个地进行整数和字符输入验证的条件,实质上是使程序损坏。
为什么只要在开头给出请求的字符,程序就不会丢弃无效字符串?字符不应该只接受单个字符字段吗?
预期数据之后的意外字符保留在输入缓冲区中。要解决此问题,您可以清除缓冲区。
尝试插入
std::cin.clear();
fflush(stdin);
在循环之间。对于更像C++的方法,插入
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n')
此方法将忽略有效输入后的任何意外字符。
我测试了这种方法,它正在工作。
相关文章:
- 正在尝试了解输入验证循环
- 如何在C++中检查2D数组中负值的输入验证
- cin 的十进制输入验证?
- 输入验证以筛选出字符、字符串和一系列整数
- 输入验证将数字放入向量中
- 在C++中使用字符数组进行输入验证
- 在C++中使用字符数组进行用户输入验证
- C++ 中字符数组的输入验证
- 检查节点的输入验证的整数
- 如何让我的程序在输入验证的基础上读取素数
- C++ 用户输入验证无法正常工作
- 程序终止,而不是继续整数输入验证循环
- 使用REGEX进行电子邮件输入验证C
- C++:输入验证器函数
- 将用户输入验证为整数:用户必须两次输入输入
- C 输入验证
- C :对输入验证函数进行编程的性能影响可以对其进行编程,而每次都可以将其编程
- 使用模板函数进行通用输入验证
- 为什么用于输入验证的 while 循环要么完全跳过循环,要么不考虑错误的输入
- 仅 C++ 字母和空格输入验证