首頁  >  問答  >  主體

输入流 - c++ 怎么输入未知数目个数字进vector,以回车结束输入?

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++,可能这问题很蠢,但是已经搜索了快两天都不知道怎么解决,求教更简便一点的方法…

PHPzPHPz2765 天前822

全部回覆(3)我來回復

  • 高洛峰

    高洛峰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類型的變數即可讀取檔案。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:22:57

    不考慮其他的情況的話:

    1. 先用【空格】分出來每個小數,放在一個vector

    2. 用atof()逐一轉換成double

    3. 轉換一個就放一個進vector

    最佳化:

    一邊解析,一邊轉換,一邊push_back進vector,一次循環搞定。

    回覆
    0
  • PHPz

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

    實現得不是很優美,將就一下吧。

    回覆
    0
  • 取消回覆