如何拒绝 cin 中的 char 输入并定义最小和最大 int 值?

How to reject char inputs in cin and define minimum and maximum int values?

我有一个程序可以在输入 char 而不是 int 时拒绝用户输入,而且这个程序有效几乎完美 - 任何输入的不是数字的内容都会被拒绝。

然而,所有这些 cins 都需要接受最小值和最大值之间的任何值,但我无法让它工作。下面的代码显示了我到目前为止的努力,但是有一个小错误。如果输入 char,然后输入超出范围的 int,然后输入另一个 char输入(我喜欢严格测试 - 我的意思是,谁知道如果实际最终用户遇到问题会发生什么)程序将 mortgageTerm 的最终值抛出为 0.

任何人都可以告诉我我哪里出错了,并给我任何指示来帮助我解决问题吗?提前感谢任何能够帮助我解决问题的人!

int mortgageTerm;
string line;
cout << "Mortgage term (1 - 40 years) : ";
while (!(cin >> mortgageTerm))
{
    cout << "That's not a valid choice! Try again : ";
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
while (getline(cin, line))
{
    stringstream linestream;
    if (!linestream >> mortgageTerm)
    {
        cout << "Input was not a number! Try again : ";
        cin >> mortgageTerm;
        continue;
    }
    if ((mortgageTerm <= 0 || mortgageTerm > 40))
    {
        cout << "Input out of range. Try again : ";
        cin >> mortgageTerm;
        continue;
    }
    char errorTest;
    if (linestream >> errorTest)
    {
        cout << "Invalid input. Try again : ";
        cin >> mortgageTerm;
        continue;
    }
    break;
}
cout << mortgageTerm;

只需在检查是否能够转换为 int 的相同条件下检查最小值和最大值,使用 ||,在表达式按顺序从左到右检查的条件下,因此第一个当您评估第二个时,它已经完成了工作,mortageTerm 将具有该值。

编辑以解决评论。

int mortgageTerm;
cout << "Mortgage term (1 - 40 years) : ";

while (!(cin >> mortgageTerm) ||
       mortageTerm < 1        ||
       mortgageTerm > 40      )
{
    cout << "That's not a valid choice! Try again : ";
    cin.clear();
    cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
}

// If you are concerned about extra input after the number and want to clear the input stream
// cin.ignore(std::numeric_limits<streamsize>::max(), '\n');

你快到了。你的第一个问题是你的第一个 while 循环根本不需要。然后我们只需要调整第二个循环以确保所有读取的输入都用于您获得的值。我们还可以通过使用单个错误语句来简化它,进行这些更改可为您提供

int mortgageTerm;
string line;
cout << "Mortgage term (1 - 40 years) : ";
while (getline(cin, line)) // consume all input given
{
    stringstream linestream(line); // you have to construct the stream from the string here
    linestream >> mortgageTerm; // try and read the data
    if (!linestream.eof() || mortgageTerm <= 0 || mortgageTerm > 40)
    {
        // either there is input left in linestream or the value is not in range
        cout << "Invalid input. Try again : ";
    }
}