4

例如,如果我输入“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;
4

2 回答 2

4

两种可能的解决方案:

  1. 首先将输入存储在 std::string 中,而不是直接存储到 int 中。然后,使用 strtol from 转换为整数。如果 endPtr 指向 0,则表示最后什么都没有,所以这没关系。否则,最后会发现一些没有数字的字符
  2. 在您的示例中,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;
        }
    }
}
于 2013-09-12T15:13:22.117 回答
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 来保存输入并根据您是否要提前中断来迭代其内容,并将输出存储到您的变量中。

于 2013-09-12T15:17:29.980 回答