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- C 或 Ctrl-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
将立即失败,因为您没有重置错误状态或丢弃缓冲区中的数据。
这是一个程序,它采用 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- C 或 Ctrl-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
将立即失败,因为您没有重置错误状态或丢弃缓冲区中的数据。