[英]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.