【问题标题】:Validating Integer input using booleans使用布尔值验证整数输入
【发布时间】:2020-11-17 03:32:46
【问题描述】:

在我的 c++ 代码中,我想使用 do while 循环验证我的用户输入是否为 1,10 之间的 int。我能够验证范围之外的整数。但是,如果用户输入一个浮点数或一个字母,它就会变成一个无限循环。我的想法是在我的 while 循环中添加一个条件,如果输入不是整数以继续要求输入。 大写字母是我遇到麻烦的地方。

#include <iostream>
using namespace std;


int main(){
    cout << "Welcome, ";
    int steps;
    int count=0;
    do{
        cout << "How many? \n";
        cin >> steps;
        IF (STEPS IS NOT INTEGER==TRUE){
            COUNT=1;
        }
        if (steps <1)
        {
            cout << "not enough...\n";
        }
        if (steps > 10){
            cout << "too many steps.\n Please pick a lower number of steps.\n\n";
        } 
      } while (steps < 1|| steps >10 || COUNT==1);
    
    //doing stuff with valid input


    return 0;
}

基本上我正在尝试添加另一个仅返回布尔值的条件。如果布尔值暗示输入无效,那么它会重新分配 count 以确保 do while 循环继续进行,直到输入有效为止。

我正在处理的问题要求最大和最小步骤,因为他们都有类似的问题,我试图简化它并忘记了一些编辑。

【问题讨论】:

  • 您声明steps 是一个整数,除此之外它不能是其他任何东西。如果您想确保用户在控制台中输入了一个数字,那么您需要使用字符串并对其进行解析以查看它是否符合预期的格式。
  • stackoverflow.com/questions/1283302/… 查看此问题的最佳答案。您不一定需要进行解析以确保您有一个整数。
  • cin &gt;&gt; steps; 正在读入 integer 变量。根据定义,结果将是int..
  • @MPops 这样的解决方案的问题是它们不能保持流的清洁。如果我输入1a1 将存储在steps 中,a 将留在流中以与下一个输入混淆。
  • 认为steps 被声明为int,它永远不会收到非int 的值!

标签: c++ if-statement while-loop do-while


【解决方案1】:

您可以检查输入是否失败,即用户输入了无法读取为int的内容,如下所示:

if (cin.fail()) {  // in place of IF (STEPS IS NOT INTEGER==TRUE)
  cin.clear();      
  cin.ignore();
  cout << "not an integer, try again\n";
  continue;
}

这避免了COUNT 变量的需要。

此外,您的 while 条件似乎与循环内的检查不匹配。当step910 时会发生什么?您应该与循环内的检查保持一致。

【讨论】:

  • 您还需要ingnore 剩下的用户输入,不是吗?我不得不承认我永远记不住“正确的方式”
  • cin.ignore(); 这里可能会很麻烦。例如 A3A 将失败。 A 将被忽略,下一次尝试将找到 3 并接受它。如果这是您想要的行为,那么酷豆。如果没有,您可能需要读入 std::string 以从流中获取整个 A3A 令牌。
  • 除了读入字符串之外,没有其他可靠的选择。问题是编写检查字符串然后转换的代码超出了许多新手的范围。
  • @MPops 取决于输入要求。如果行上有多个标记,则忽略换行可能无济于事。
  • @user4581301 啊,所以如果你有一个逗号分隔或者比换行符分隔的输入更复杂的东西,最好加载整个内容并继续
【解决方案2】:

您可以使用! 运算符。

例如:

if ( !(std::cin >> steps) )
        {
          std::cin.clear();
          std::cin.ignore();
          std::cout << "Incorrect entry. Try again: ";
        }

同时考虑不使用using namespace std;

【讨论】:

  • 为什么我不应该使用using namespace std;
  • 点击它,有一个指向那个确切问题的链接。
猜你喜欢
  • 1970-01-01
  • 2014-06-05
  • 2021-03-18
  • 1970-01-01
  • 2021-01-14
  • 2023-02-18
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多