【问题标题】:get list of numbers from stdin and tokenize them从标准输入获取数字列表并标记它们
【发布时间】:2009-07-17 21:43:17
【问题描述】:

如何从用户那里获取数字列表,然后对它们进行标记。

这是我所拥有的,但除了第一个数字之外什么都没有:

#include <iostream>
#include <sstream>
#include <vector>
#include <string>

using namespace std;

int main()
{

    string line = "";
    cin >> line;

    stringstream lineStream(line);

    int i;
    vector<int> values;

    while (lineStream >> i)
        values.push_back(i);

    for(int i=0; i<values.size(); i++)
        cout << values[i] << endl;

    system("PAUSE");
    return 0;
}

相关帖子:
C++, Going from string to stringstream to vector
Int Tokenizer

【问题讨论】:

  • 在一行中输入多个数字,以空格分隔,然后回车,它将获取所有数字。问题是您只阅读第一行。

标签: c++ tokenize stringstream


【解决方案1】:

这可能是从cin 读取值到容器中的最简单方法:

#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> values;
    std::copy(
        std::istream_iterator<int>(std::cin), 
        std::istream_iterator<int>(),
        std::back_inserter(values));

    // For symmetry with the question copy back to std::cout
    std::copy(
        values.begin(),
        values.end(),
        std::ostream_iterator<int>(std::cout,"\n"));

}

【讨论】:

    【解决方案2】:

    我相信 cin >> 会在空格处中断,这意味着您只会输入第一个数字。

    尝试:

    getline(cin, line);
    

    【讨论】:

    • 如果你把它放在一个循环中就不行:while(std::cin >> i) { /* Do STUFF */ }
    • 为什么要循环,什么时候可以一次调用?
    【解决方案3】:

    就像 Donnie 提到的空格上的 cin 中断,所以要克服这个问题,我们可以使用 'getline()',以下示例效果很好:

    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    
        string line = "";
        ::getline(std::cin,line,'\n');
    
        std::stringstream lineStream(line);
    
        int i;
        std::vector<int> values;
    
        while (lineStream >> i)
            values.push_back(i);
    
        for(int i=0; i<values.size(); i++)
            cout << values[i] << endl;
    
        system("PAUSE");
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      在主目录之上

      string line = "";
      getline (cin, line );
      stringstream lineStream(line);
      

      【讨论】:

        【解决方案5】:

        是的,并且是字符串版本的 getline,而不是 istream 版本。

        【讨论】:

          【解决方案6】:

          好的:Pavel Minaev 给出了最佳答案。
          但是所有提到 cin 在空白处中断的人。
          这是一件好事(因为它也忽略了空白);

          #include <iostream>
          #include <sstream>
          #include <vector>
          #include <string>
          
          using namespace std;
          
          int main()
          {
          
              int i;
              vector<int> values;
          
              // prefer to use std::copy() but this works.
              while (std::cin >> i)
              {
                  values.push_back(i);
              }
          
              // prefer to use std::copy but this works.
              for(vector<int>::const_iterator loop = values.begin();loop != values.end();++loop)
              {
                  cout << *loop << endl;
              }
          
              return 0;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-04
            • 1970-01-01
            相关资源
            最近更新 更多