Rumah > Soal Jawab > teks badan
C++初学学生,求用简单的语言说明,非常感谢!
一行double带小数点的数字,不定项数量,每个数字之间用不定项个空格隔开,以回车结束输入,放进一个vector里。
比如这样
1.1 2.2 3.3 4.4 5.5 回车
本来是想用cin来跳过空格但是也会跳过回车,如果用cin.get的话得到的是char型,转成double的话小数点后面会丢失。现在的想法就是getline得到一整行,然后一位数一位数地分析,空格丢掉,连在一起的数字重新整合成一个double。
又想了一阵子然后用unget()做到了..不清楚有没有更好一点的办法.
vector<double> v1;
char t;
do //input first line
{
cin.unget();
cin >> count;
v1.push_back(count);
} while ((t=cin.get())!='\n');
初学c++,可能这问题很蠢,但是已经搜索了快两天都不知道怎么解决,求教更简便一点的方法…
高洛峰2017-04-17 13:22:57
方法一,可以分多行输入,每行不限个数,自动忽略输入中的空白符(空行、空格、制表符)。
std::vector<double> v;
for (double d; std::cin >> d; v.push_back(d)) {}
方法二,仅输入一行,自动忽略输入中的空白符(空行、空格、制表符)。
#include <sstream>
std::vector<double> v;
std::string line;
std::getline(std::cin, line);
std::istringstream iss(line);
for (double d; iss >> d; v.push_back(d)) {}
方法三,效果同方法一。
#include <iterator>
std::istream_iterator<double> in(std::cin), eof;
std::vector<double> v(in, eof);
注:把上述方法中的std::cin
换成任一std::istream
类型的变量或其子类的变量效果相同。例如换成std::ifstream
类型的变量即可读取文件。
PHP中文网2017-04-17 13:22:57
不考虑其他的情况的话:
先用【空格】分出来每个小数,放在一个vector<char*>里
用atof()逐个转换成double
转换一个就放一个进vector<double>
优化:
一边解析,一边转换,一边push_back进vector,一次循环搞定。
PHPz2017-04-17 13:22:57
C++流式输入风格
double x;
while(!cin.eof())
{
cin>>x;
v.push_back(x);
}
C风格输入
double x;
while(scanf("%lf",&x)!=EOF) v.push_back(x);
/*
EOF是个库中的宏定义
#define EOF (-1)
*/
以上方法适用于从文件中读入,不适合控制台输入(因为控制台无法知道你到底输完了没)
如果是控制台输入,可以先读入一整行,然后再逐个读入:
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
#define SIZE_BUFF (100)
char s[SIZE_BUFF],*p=s;
cin.getline(s+1,SIZE_BUFF);
vector<double> v;
double x;
for(s[0]=' ';*p;++p)
{
if(*p!=' ') continue;
while(*++p==' ');
sscanf(p,"%lf",&x);
v.push_back(x);
}
for(vector<double>::iterator i=v.begin();i!=v.end();++i)
printf("%lf\n",*i);
return 0;
}
实现得不是很优美,将就一下吧。