c++ - 尝试读取失败后 cin 读数为零

标签 c++ vector cin

我希望用户输入 vector<double> a_ 的值直到没有 double 值被读取。我想制作一个名为 b_ 的 double vector 它的大小取决于 a_的大小,其实是一模一样的。 b_ 的初始化必须靠近a_在里面。但是 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

最佳答案

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

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>>的行为,

If extraction fails, zero is written to value and failbit is set. If extraction results in the value too large or too small to fit in value, std::numeric_limits::max() or std::numeric_limits::min() is written and failbit flag is set.

设置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

关于c++ - 尝试读取失败后 cin 读数为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33956092/

相关文章:

c++ - Google.Com 上的 Http GET 请求返回 "Error 302 page has been moved"

c++ - 如何初始化 std::map 项的 std::vector?

c++ - 返回使用自定义分配器的 vector

c++ 如何修复 std::cin 错误或解决它

c++ - 为什么 getline(...) 打印在屏幕上?

c++ - 输入字符串时使用 cin 无限循环,而需要输入数字

c++ - 使用MPI取数据临时使用然后返回结果

c++ - 我不能使用 std::shared_ptr

c++ - 访问指针 vector 中的元素

c++ - 是否正则表达式(获取不是所有满足正则表达式的文本)