C++ 第二个cin被跳过或工作不正常

C++ 第二个cin被跳过或工作不正常,c++,linux,macos,cin,C++,Linux,Macos,Cin,我有两个问题,我认为它们是密切相关的,但我无法按照我之前在网站上发现的解决它们 我的问题与在我的主要功能中重复使用cin有关。我需要从键盘上读取数字,以便构建小向量或存储单个系数。我无法预先知道我将要构建的向量的长度 以下是涉及的内容: #include <vector> #include <iostream> #include <limits> int main() { ... double a=0; std::vector<

我有两个问题,我认为它们是密切相关的,但我无法按照我之前在网站上发现的解决它们

我的问题与在我的主要功能中重复使用
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;
    ...
}
#包括
#包括
#包括
int main(){
...
双a=0;
std::向量系数;
而(std::cin>>a){
系数。推回(a);
}
...
std::向量间隔;
std::cin.clear();
std::cin.ignore(std::numeric_limits::max());
而(std::cin>>a){
间隔。推回(a);
}

std::cout您需要添加一个linefeed
'\n'
作为
cin.ignore()
的第二个参数,因此它会在按enter键时终止忽略您需要添加一个linefeed
'\n'
作为
cin.ignore()
的第二个参数,因此它会在按enter键时终止对
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;
}
生成此输出:

$ ./a.out < data                  
3
5
1 5
$./a.out
您对
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;
}
生成此输出:

$ ./a.out < data                  
3
5
1 5
$./a.out
你考虑过改用
getline
吗?是的,我考虑过了,除了去掉
cin。忽略
行,我的代码可以在Linux机器上按预期运行。但是,macOS不是这样。所以,我应该一劳永逸地放弃
cin
吗?你考虑过使用
getline
取而代之的是吗?是的,我这样做了,除了去掉
cin.ignore
行之外,让我的代码在Linux机器上按预期运行。然而,macOS的情况并非如此。因此,我应该一劳永逸地放弃
cin
?是的,我也尝试过,但没有任何改变。在macOS上,第二个cin只是被跳过,在L上inux仍然不能像我上面解释的那样工作。是的,我也尝试过,但没有任何改变。在macOS上,第二个cin只是被跳过,在Linux上它仍然不能像我上面解释的那样工作。谢谢!我不知道
std::cin.ignore()
设置流的失败位。现在程序在Linux上运行良好。在macOS上仍然保持不变,但现在是次要的。谢谢!我不知道
std::cin.ignore()
设置流的失败位。现在程序在Linux上运行良好。在macOS上仍然保持不变,但现在是次要的。