使用cin.clear()或cin,ignore()仅用于上一行输入?

时间:2012-02-21 14:48:42

标签: c++

有没有办法使用cin.clear()或cin,ignore()仅用于上一行输入而不清除以前的所有输入?例如,在我的代码中,我提示用户输入每个月,如果输入小于0,我希望程序清除该负输入,以便它不会完全进入我的计算。问题是它清除所有先前的输入仍然搞砸了计算。提前感谢任何想法。

// prompt user for input, keep a total sum of data entered
    for(int i = 0; i < 12; i++)
    {
        cout << "Enter total rainfall for " << year[i] << endl;
        cin >> month[i];
        total += month[i];

    while(month[i] < 0)
    {
        cout << "Ony enter positive numeric values!" << endl;
        cin.clear();
            cin >> month[i];

    }   


    }

2 个答案:

答案 0 :(得分:3)

你似乎在混淆两个不同的问题。 ios_base::clear() 不删除任何输入;它会重置流的错误状态。 另一方面,istream::ignore( n, ch )向前读,直到n 已提取字符或看到字符ch myInput.ignore( INT_MAX, '\n' )应该忽略所有内容(和 包括)下一个'\n'

但是你的代码有一件很奇怪的事情:

cin << month[i];

您无法输出到std::cin

答案 1 :(得分:1)

你可能想要这样的东西:

unsigned int month[12];

for(size_t i = 0; i < 12; i++)
{
    cout << "Enter total rainfall for month " << i+1 << endl;
    while (!(cin >> month[i]))
    {
        cout << "Invalid input, try again." << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');    
    }
    // you probably want to repeat ignore() stuff here
    // so in case user inputs something like 10x, the "x" that was left
    // in the stream gets discarded
}

注意无符号整数数组。这样,“-5”之类的输入自动被视为无效,因此您不需要小于0的检查。清除整个流不应该担心 - 如果输入操作成功,相关部分已经存储在您的数组中。