繁体   English   中英

第二个cin被跳过或无法正常工作

[英]Second cin is either skipped or does not work properly

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

我的问题与我的主要功能中的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上,第二个读取过程的行为与预期的不同。 我的意思是如果我在第二个cin给出-1 1 ,则打印的矢量大小为0,显然,程序因分段错误而停止。

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

在此先感谢所有人! :)

您需要将换行符'\\n'作为第二个参数添加到cin.ignore()以便它在输入按下时cin.ignore()忽略

您对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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM