第二个cin被跳过或无效

时间:2017-01-30 13:08:11

标签: c++ linux macos cin

我有几个问题,我认为这些问题有密切联系,但我无法按照我之前在网站上找到的内容修复它们。

我的问题与我的主要功能中cin的双重使用有关。我需要从键盘读取数字,以便构建小向量或存储单个系数。我事先无法知道我要构建的向量的长度。

以下是涉及的内容:

#include <vector>
#include <iostream>
#include <limits>

int main() {
    ...
    double a=0;
    std::vector<double> coefficients;
    while (std::cin>>a) {
       coefficients.push_back(a);
    }
    ...
    std::vector<double> interval;
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max());
    while(std::cin>>a) {
       interval.push_back(a);
    }
    std::cout<<interval.size()<<std::endl;
    std::cout<<*interval.cbegin()<<" "<<*(interval.cend()-1)<<std::endl;
    ...
}

我同时使用macOS和g ++ 6.3.0以及Linux和g ++ 5.3.0。我发送给编译器的标志是-Wall -std=c++14 -o 在macOS机器上完全跳过第二个cin,而在Linux上,第二个读取过程的行为与预期的不同。我的意思是,如果我在第二个-1 1给出cin,则打印的矢量大小为0,显然,程序因分段错误而停止。

在每个cin我在一行中输入所请求的数字,例如1 0 0 1,然后按Enter键,然后按ctrl + D.

提前感谢所有人! :)

2 个答案:

答案 0 :(得分:0)

您需要将换行table2.uid #1 and #2作为第二个参数添加到'\n',以便在输入时按<= p>

答案 1 :(得分:0)

您对std::cin.ignore(...)的调用设置了流的失败位。这使得无法进入循环。您需要在循环之前移动std::cin.clear()调用,以使其运行。当第二个容器中没有数据时,你也会有一个越界读数。

#include <vector>
#include <iostream>
#include <limits>
#include <string>

int main() {
    double a=0;
    std::vector<double> coefficients;
    while (std::cin>>a) {
       coefficients.push_back(a);
    }
    std::cout << coefficients.size() << '\n';

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'X');
    std::cin.clear();
    char c;
    std::cin>>c;
    if(c != 'X')
    {
        std::cerr << "Invalid separator\n";
        return 1;
    }

    std::vector<double> interval;
    while(std::cin >> a) {
       interval.push_back(a);
    }
    std::cout<< interval.size()<<std::endl;
    if(interval.size())
        std::cout<<*interval.cbegin()<<" "<<*(interval.cend()-1)<<std::endl;

    return 0;
}

使用以下数据文件

$ cat data.txt
12 23
42
X
1 2
3 4 5

生成此输出:

$ ./a.out < data                  
3
5
1 5