c++ - 了解 cin.fail() 和 cin.clear - 向量附加程序
问题描述
这是我在 Stack Overflow 上的第一篇文章,如果我忽略了以下帖子中的任何手续,请原谅我
我目前正在使用 GNU GCC 编译器在 Code::Blocks 17.12 上编写 C++ 程序。该程序适用于 Big C++ 第 2 版的练习 P6.4,我必须编写一个函数来附加/组合两个值得用户输入的向量,然后返回该向量
我可以很好地输入第一个向量,但由于某种原因它不允许我输入第二个向量。
我有一种感觉,在 while 循环中使用 cin.fail() 也会触发我的第二个布尔值立即变为 false。为此,我添加了 cin.clear(),希望它会重置流以允许第二个向量输入,但无济于事。
是真的 cin.fail() 导致了这个错误,还是我忽略了其他东西?
编辑:使用 crtl-z,我现在能够获得第二个向量,并运行程序完成,尽管第一个向量 a/a_vct 的最后一个元素复制了两次。您能否指出一些有关使用 crtl-z 的资源以更好地了解其用途?(还没有在书中介绍)例如。如果我为 a_vct 输入 1 2 3,为 b_vct 输入 1 2 3,c_vct 将输出 1 2 3 3 1 2 3 0
#include <iostream>
#include <vector>
using namespace std;
vector<double>append(vector<double>a,vector<double>b)
{
vector<double>c; //combined vct
for (int i=0; i<a.size(); i++)
{
c.push_back(a[i]);
}
for (int i=0; i<b.size(); i++)
{
c.push_back(b[i]);
}
return c;
};
int main()
{
vector<double>a_vct; //inputs
vector<double>b_vct; //inputs
vector<double>c_vct; //appended vct
cout<<"Welcome to the vector append-er!"<<endl;
cout<<"Please enter 1st Vector (enter v to set vector after inputs):"<<endl;
bool v1_add=true;
while(v1_add)
{
double a;
cin>>a;
a_vct.push_back(a);
if(cin.fail()) //double usage is setting both bools to false???
{
v1_add=false;
}
}
cin.clear();
cout<<"Please enter 2nd Vector. Please enter the same number of elements (enter v to set vector after inputs):"<<endl;
bool v2_add=true;
while(v2_add)
{
double b;
cin>>b;
b_vct.push_back(b);
if(cin.fail())
{
v2_add=false;
}
}
c_vct=append(a_vct,b_vct);
cout<<"The appended vector is:"<<endl;
for (int i=0; i<c_vct.size(); i++)
{
cout<<c_vct[i]<<" ";
}
return 0;
}
编辑 2:根据响应的新更改,现在按预期工作
if(cin.good())
{
a_vct.push_back(a);
}
if(cin.good())
{
b_vct.push_back(b);
}
解决方案
在输入第一个向量输入后Ctrl+Z
,为 Windows 或Ctrl+D
linux编写(通过键盘而不是数字)cin.fail()
以true
停止循环输入,并在输入第二个向量输入之后。
请注意,向量将重复最后的条目,因为您push_back(a)
在检测cin.fail()
. 因此,您可以通过更改来避免这种情况
a_vct.push_back(a);
至
if(cin.good()) a_vct.push_back(a);