gpt4 book ai didi

c++ - 第二个 cin 被跳过或不能正常工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:21:39 25 4
gpt4 key购买 nike

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

我的问题与在我的主函数中重复使用 cin 有关。我需要从键盘读取数字以构建小 vector 或存储单个系数。我无法提前知道我要构建的 vector 的长度。

这里是涉及的行:

#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;
...
}

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

在每个 cin 处,我在一行中输入请求的数字,例如 1 0 0 1,然后按 enter,然后按 ctrl+D。

在此先感谢大家! :)

最佳答案

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

关于c++ - 第二个 cin 被跳过或不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41936723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com