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

时间:2017-04-10 19:08:27

标签: c++ cin stringstream

我有一个程序,如果输入 char 而不是 int ,则能够拒绝用户输入,这几乎完美 - 输入的任何内容都不是'数字被拒绝。

但是,所有这些 cin 需要接受最小值和最大值之间的任何值,但我无法使其工作。下面的代码显示了我到目前为止的努力,但是有一个小错误。如果输入 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;

2 个答案:

答案 0 :(得分:0)

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

编辑处理评论。

plt.triplot(x, y, triangles=triangles)

答案 1 :(得分:0)

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

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