例如,如果我输入“2a”,它不会显示错误,也不会要求用户重新输入值。我该如何解决这个问题?
while (std::cin.fail())
{
std::cout << "ERROR, enter a number" << std::endl;
std::cin.clear();
std::cin.ignore(256,'\n');
std::cin >> dblMarkOne;
}
std::cout << "" << std::endl;
答案 0 :(得分:3)
两种可能的解决方案:
std::cin >> dblMarkOne;
会在std::cin
中留下非数字字符,因此如果std::cin
之后仍有数据可用,例如使用std::cin.peek()!=EOF
,这意味着用户输入了多个号码。编辑:完整测试的代码:
#include <iostream>
#include <cstdio>
int main(int argc, char ** argv)
{
bool ok = false;
int dblMarkOne;
std::cout << "Enter a number" << std::endl;
while (!ok)
{
std::cin >> dblMarkOne;
if(!std::cin.fail() && (std::cin.peek()==EOF || std::cin.peek()=='\n'))
{
ok = true;
}
else
{
std::cin.clear();
std::cin.ignore(256,'\n');
std::cout << "Error, Enter a number" << std::endl;
}
}
}
答案 1 :(得分:0)
一种方法是使用isDigit()函数。
对于ascii中的数字字符返回1,否则返回0。
如何使用它取决于您是否期望一位数,而只是检查或想要更长的数字。
如果要提取在出现非数字字符之前出现的数字字符,请将其存储到char []或std :: string,然后遍历每个字符,丢弃您不想要的字符或退出在第一个角色。
如果你只是在一个数字之后,修改你的循环:
std::cin >> dblMarkOne;
while (!isDigit(dblMarkOne)) {
std::cout << "ERROR, enter a number" << std::endl;
std::cin.clear();
std::cin.ignore(256,'\n');
std::cin >> dblMarkOne;
}
如果你想要一个长于一位数的数字,只需创建一个std :: string来保存输入并根据你是否要提前中断来迭代其内容,并将输出存储到你的变量中