在尝试读取失败后,cin读取为零

时间:2015-11-27 11:10:17

标签: c++ vector cin

我希望用户输入vector<double> a_的值,直到不会读取双值。我想制作一个名为b_的双精度矢量,其大小取决于a_的大小,实际上它完全相同。 b_的初始化必须接近a_ init。但是b_存在一些问题,我没有这个问题。 b_的所有值都设置为0.

代码:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<double> a_, b_;
    double tmp;
    while(cin >> tmp) {
        a_.push_back(tmp);
    }
    cout << "A size = " << a_.size() << endl;
    for(int i = 0; i < a_.size(); i++) {
        cin >> tmp;
        b_.push_back(tmp);
    }
    for(int i = 0; i < a_.size(); i ++) { 
        cout << "a[" << i <<"] = " <<a_[i];
        cout << " " <<"b[" << i <<"] = " <<b_[i] << endl;
    }
    return 0;
}

输入是:

4
5
6
e
7
8
9

输出是:

A size = 3
a[0] = 4 b[0] = 0
a[1] = 5 b[1] = 0
a[2] = 6 b[2] = 0

3 个答案:

答案 0 :(得分:1)

我通过评论添加了一些解释:

while(cin >> tmp) {
    a_.push_back(tmp); // read 4, 5, 6 and push_back them
}                      // the loop ends when extraction fails for reading e

...

for(int i = 0; i < a_.size(); i++) {
    cin >> tmp;        // extraction fails for reading e everytime, 
                       // and tmp will be set to 0.0
    b_.push_back(tmp); // push_back 0.0 everytime
}

请注意,根据std::basic_istream::operator>>的行为,

  

如果提取失败,则将零写入值并设置failbit。如果提取结果的值太大或太小而不适合值,则写入std :: numeric_limits :: max()或std :: numeric_limits :: min()并设置failbit标志。

设置failbit后,如果要进一步读取,则需要清除failbit并丢弃导致错误的字符。如:

// ...
cin.clear();
cin.ignore();
for(int i = 0; i < a_.size(); i++) {
    cin >> tmp;
    b_.push_back(tmp);
}
// ...

然后输入:

4
5
6
e
7
8
9

你会得到

A size = 3
a[0] = 4 b[0] = 7
a[1] = 5 b[1] = 8
a[2] = 6 b[2] = 9

LIVE

答案 1 :(得分:0)

格式化提取失败后,cin.fail()将返回true。除非failbit cout << "A size = " << a_.size() << endl; std::cin.clear(); std::cin.ignore(); for(int i = 0; i < a_.size(); i++) { cin >> tmp; b_.push_back(tmp); }

,否则任何进一步提取也将失败

此外,由于错误值仍在输入流中,您需要.clear()它:

signingConfigs{
unsigned{
    storePassword = ""
    keyAlias = ""
    keyPassword = ""
}
}

答案 2 :(得分:0)

cin使用&#34;失败&#34;标志内部标记输入失败,返回空指针,以便&#34;而&#34;可以注意到它。所以你需要在第一次 cin&gt;&gt; tmp 之后使用 cin.clear()来重置&#34;失败&#34; cin的旗帜。

你不应该在&#34;中使用 cin&gt;&gt; tmp 作为&#34;循环,因为你希望每次读取数字。

这是一个有效的代码:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<double> a_, b_;
    double tmp;
    while(cin >> tmp) {
        a_.push_back(tmp);
    }
    cin.clear();
    cout << "A size = " << a_.size() << endl;
    for(int i = 0; i < a_.size(); i++) {
        do {tmp = cin.get();} while (tmp=='\n');
        b_.push_back(tmp);
    }
    for(int i = 0; i < a_.size(); i ++) { 
        cout << "a[" << i <<"] = " <<a_[i];
        cout << " " <<"b[" << i <<"] = " <<b_[i] << endl;
    }
    return 0;
}

然后输入

4
5
6
a
b
c

你会得到

A size = 3
a[0] = 4 b[0] = 97
a[1] = 5 b[1] = 98
a[2] = 6 b[2] = 99