istream 循环使程序跳过 cin 语句

istream loop makes the program jump over cin statement

这是一个程序,它采用 space 分隔的数字序列,然后将其存储在向量中。问题是当 cin 循环放在 x0 的输入之前时,程序会跳转到下一个 cin 语句,但反向工作非常正常。

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

跳跃状态:

vector<int> V{};
int x0{}, temp{};
        
cout << "Enter sequence\n";
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 sequence\n";
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 的错误状态)需要在 [=17] 之后完成=] 失败,而不是在 isalpha() 检查之后,例如:

vector<int> V;
int x0, temp;
        
cout << "Enter sequence\n";
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 将立即失败,因为您没有重置错误状态或丢弃缓冲区中的数据。