0

在使用“std::cin >>”输入值时出错后,我希望能够继续使用输入。

例如,在将字符放入整数变量后,源代码中使用 cin 函数的所有其他语句都将停止工作。

创建错误后是否可以继续使用 cin ?

#include <iostream>
using namespace std;


int addition(){
int sum = 0, val = 0;
while(cin >> val){
sum += val;
}

return sum;
}

int multiplication(){
int x = 0, y = 0;
cin >> y;
x = y;
while(cin >> y){
x = x * y;
}

return x;
}


int main()
{

int x = addition();
int y = multiplication();

return 0;
}
4

2 回答 2

3

如果由于您尝试读取整数并得到一些“非数字”字符而导致错误,则需要使用cin.clear()清除错误,然后cin.get()或类似的方法删除有问题的字符。如果你收到了end-of-file,那就更难了,因为这在某些实现中往往会“粘住”——所以,基本上,如果你遇到文件结尾,游戏就结束了,除非你跳过一些非常讨厌的箍(编写你自己的streambuf似乎是一种解决方案,但这就像在你的眼睛里刺红热针一样令人愉快,我被告知 - 从来没有真正尝试过......)。

有许多替代解决方案,例如读取字符串,然后尝试将其转换为数字,或者一次读取一个字符,然后自己进行翻译,或者使用一些现成的库来为您翻译。如果用户点击“文件结束”键(Windows 和其他一些中的 CTRL-Z,Linux/Unix/MacOS X 中的 CTRL-D 及相关 - 不确定 MacOS,这些都不能保证让您继续在 X 之前,但还有人在乎吗?)

于 2013-07-08T22:00:36.187 回答
0

您只需要读出字符并重试。

while( !(cin >> y) && !cin.eof() )
{
    cin.get();  // Skip invalid character
}

这有点不寻常。我们通常期望的是输出一个错误。如果在提示符下输入值,我们倾向于使用getline,然后解析结果:

while(1)
{
    string line;
    if( getline(cin, line) )
    {
        istringstream iss(line);
        if( iss >> y ) {
            break;
        } else {
            cerr << "Invalid input.  Try again.\n";
        }
    } else {
        cerr << "End of stream\n";
        break;
    }
}
于 2013-07-08T21:53:39.413 回答