检查条件时的无限循环c ++!cin

时间:2013-02-23 11:23:21

标签: c++

我基本上期待一个数字作为输入。由于我知道我的其他循环工作正常,因此数量可以忽略不计。但测试一下这个数字是否有点棘手。我只想再次调用该函数,如果用户输入的是字母数字或简单的单词,则重新开始。或者按下回车键。不是数字的东西。我试过了!因为我正在输入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;
}
}

4 个答案:

答案 0 :(得分:0)

您只需从用户而不是int中读取字符串,然后检查它并在不喜欢字符串时提示输入新内容(例如,如果它没有干净地转换为数字,您可以查看strtol)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

这样做的一种方法是在尝试将文本转换为整数之前使用getline()来读取完整的文本行。以下代码段说明了这一点:

#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的状态,以确保没有发生某些错误。

答案 3 :(得分:-2)

我认为这会有所帮助

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;
  }
 }