istream循环使程序跳过cin语句



下面是一个程序,它接受空格分隔的数字序列并将其存储在一个向量中。问题是当把cin循环放在x0输入之前,程序跳转下一个cin语句,但反向工作非常正常。

你能给我解释一下我遗漏了什么吗?

跳转状态:

vector<int> V{};
int x0{}, temp{};

cout << "Enter sequencen";
for(temp;cin>>temp;)
{
if (!isalpha(temp)) V.push_back(temp);
else
{
cin.clear();
break;
}
}
cout<<"enter x0 : ";
cin >> x0;// the program skips this!

工作反向:

vector<int> V{};
int x0{}, temp{};
cout<<"enter x0 : ";
cin >> x0;
cout << "Enter sequencen";
for(temp;cin>>temp;)
{
if (!isalpha(temp)) V.push_back(temp);
else
{
cin.clear();
break;
}
}

在第一个示例中,您在一个循环中调用cin >> temp,直到读取失败,要么是因为输入了一个非整数,要么是因为用户显式地结束输入(使用Ctrl-CCtrl-Z或您的平台使用的任何方法)。然后你试图调用cin >> x0而没有首先清除cin的错误状态,因此读取也会失败。

您对cin.clear()的调用(不丢弃cin的输入缓冲区中的数据,仅重置cin的错误状态)需要在operator>>失败后完成,而不是在isalpha()检查之后,例如:

vector<int> V;
int x0, temp;

cout << "Enter sequencen";
do
{
if (!(cin >> temp))
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), 'n');
break;
}
if (isalpha(temp))
break;
V.push_back(temp);
}
while (true);
cout << "enter x0 : ";
cin >> x0;

在第二个示例中,您没有尝试在读取失败后调用cin >> x0,这就是代码工作的原因(前提是用户实际上为cin >> x0输入了一个有效的整数,否则cin >> temp将立即失败,因为您没有重置错误状态或从缓冲区丢弃数据)。

最新更新