我有几个问题,我认为这些问题有密切联系,但我无法按照我之前在网站上找到的内容修复它们。
我的问题与我的主要功能中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.
提前感谢所有人! :)
答案 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