下面是一个程序,它接受空格分隔的数字序列并将其存储在一个向量中。问题是当把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-C或Ctrl-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
将立即失败,因为您没有重置错误状态或从缓冲区丢弃数据)。