【问题标题】:Infinite Loop when checking conditions c++ !cin检查条件时的无限循环 c++ !cin
【发布时间】:2013-02-09 00:04:10
【问题描述】:

我基本上期待一个数字作为输入。现在这个量级可以忽略不计,因为我知道我的 else if 循环工作正常。但是测试它的数字是否被证明有点棘手。如果用户输入字母数字或简单的单词,我只想再次调用该函数并重新开始。或按回车。不是数字的东西。我尝试了 !cin,因为我正在输入 int numTemp,但这只会导致无限循环,无限循环地溢出 "what is the bitrate"。有人知道我在做什么错吗?我尝试将 cin.clear()cin.ignore(100, "\n") 放在第一个 if 语句中,但无济于事。提前致谢。

bool iTunes::setBitRate()
{
cout << "What is the bitrate? ";
int numTemp;
cin >> numTemp;
if (!cin)
{
    cout << "WRONG" << endl;
    setBitRate();
}
else if( numTemp < MIN_BITRATE || numTemp > MAX_BITRATE)
{
    cout << "Bit Rate out of range" << endl;
    setBitRate();
}
else
{
    bitRate = numTemp;
}
}

【问题讨论】:

  • 恕我直言,递归调用是否是一个好主意是值得怀疑的,我更喜欢循环读取值。
  • 您需要cin.clear()cin.ignore 从输入中删除非数字。否则每个连续的输入都会失败,原因都是一样的。

标签: c++


【解决方案1】:

您可以只从用户那里读取一个字符串而不是一个 int,然后检查它并在您不喜欢该字符串时提示新输入(例如,如果它没有完全转换为数字,您可以检查strtol)。

【讨论】:

    【解决方案2】:

    如果要检查输入是数字还是字符,可以使用isdigit,但必须传递char,然后当它是数字时,可以将其转换为int atoi

    【讨论】:

      【解决方案3】:

      当语句 cin &gt;&gt; numTemp 由于非数字输入而失败时,导致失败的字符从输入流中删除。因此,下次调用流提取运算符时,它将看到与上次相同的非数字输入。为避免这种情况,您需要跳过现有输入。

      这样做的一种方法是使用getline() 读取整行文本,然后再尝试将其转换为整数。以下代码 sn-p 说明了这一点:

      #include <cstdlib>
      
      bool getint(istream& in, int & out) {
          string line;
          getline(in, line);
          char* endptr;
          out = strtol(line.c_str(), &endptr, 10);
          return endptr!=line.c_str();
      }
      
      bool iTunes::setBitRate()
      {
          cout << "What is the bitrate? ";
          int numTemp;
          if ( !getint(cin, numTemp) && cin )
          {
              cout << "WRONG" << endl;
              setBitRate();
          }
          else if( numTemp < MIN_BITRATE || numTemp > MAX_BITRATE)
          {
              cout << "Bit Rate out of range" << endl;
              setBitRate();
          }
          else
          {
              bitRate = numTemp;
          }
      }
      

      注意:您还应该在每次读取后检查 cin 的状态,以确保没有发生某些错误。

      【讨论】:

        【解决方案4】:

        我认为这会有所帮助

        bool iTunes::setBitRate()
        {
          cout << "What is the bitrate? ";
          int numTemp = 0;
          cin >> numTemp;
          if (!numTemp)
          {
            cout << "WRONG" << endl;
            setBitRate();
          }
          else if( numTemp < MIN_BITRATE || numTemp > MAX_BITRATE)
          {
            cout << "Bit Rate out of range" << endl;
            setBitRate();
          }
          else
          {
             bitRate = numTemp;
          }
         }
        

        【讨论】:

        • 我认为这会调用未定义的行为,因为您正在测试 numTemp 的值,该值在错误情况下可能未初始化。
        猜你喜欢
        • 1970-01-01
        • 2021-06-27
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 2020-11-07
        • 1970-01-01
        • 1970-01-01
        • 2021-05-10
        相关资源
        最近更新 更多