1

我基本上期待一个数字作为输入。现在这个幅度可以忽略不计,因为我知道我的 else if 循环工作正常。但是测试它的数字是否被证明有点棘手。如果用户输入字母数字或简单的单词,我只想再次调用该函数并重新开始。或按回车。不是数字的东西。我尝试了 !cin ,因为我正在输入int numTemp,但这只会导致无限循环溢出"what is the bitrate"无数次。有人知道我在做什么错吗?我尝试将cin.clear()andcin.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

4 回答 4

0

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

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

于 2013-02-23T12:26:53.543 回答
0

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

于 2013-02-23T11:26:36.007 回答
0

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

于 2013-02-23T11:27:12.327 回答
-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;
  }
 }
于 2013-02-23T11:26:24.030 回答