【问题标题】:How to read space separated numbers from console?如何从控制台读取空格分隔的数字?
【发布时间】:2011-07-26 17:15:21
【问题描述】:

我正在尝试执行一项简单的任务,即从控制台将空格分隔的数字读取到 vector<int>,但我不知道如何正确执行此操作。

这是我到目前为止所做的:

int n = 0;
vector<int> steps;
while(cin>>n)
{
    steps.push_back(n);
}

但是,这需要用户按一个无效字符(例如a)来中断while 循环。我不想要它。

一旦用户输入像0 2 3 4 5 这样的数字并按下Enter,我希望循环被打破。我也尝试使用istream_iteratorcin.getline,但我无法让它工作。

我不知道用户会输入多少元素,因此我使用vector

请提出正确的方法。

【问题讨论】:

    标签: c++ stl iostream


    【解决方案1】:

    使用getline 结合istringstream 来提取数字。

    std::string input;
    getline(cin, input);
    std::istringstream iss(input);
    int temp;
    while(iss >> temp)
    {
       yourvector.push_back(temp);
    }
    

    【讨论】:

    • 但该方法需要我不知道的流大小。你能发布一个示例代码吗?
    • 哎呀..好的,我现在通过@templatetypedef 示例得到它。您指的是免费功能geline,而不是cin.getline
    • #include 否则你会得到一个错误“istringstream iss has initializer 但类型不完整”
    【解决方案2】:

    为了详细说明 jonsca 的回答,这里有一种可能性,假设用户忠实地输入了有效整数:

    string input;
    getline(cin, input);
    
    istringstream parser(input);
    vector<int> numbers;
    
    numbers.insert(numbers.begin(),
                   istream_iterator<int>(parser), istream_iterator<int>());
    

    这将正确读取和解析来自cin 的有效整数行。请注意,这是使用 free 函数 getline,它适用于 std::strings,而不是 istream::getline,它适用于 C 风格的字符串。

    【讨论】:

      【解决方案3】:

      这段代码应该可以帮助你,它读取一行到一个字符串,然后遍历它,得到所有的数字。

      #include <iostream>
      #include <sstream>
      #include <string>
      
      int main() {
          std::string line;
          std::getline(std::cin, line);
          std::istringstream in(line, std::istringstream::in);
          int n;
          vector<int> v;
          while (in >> n) {
              v.push_back(n);
          }
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        另外,知道您可以刺激 EOF 可能会有所帮助 - 在您完成输入后,在命令行中按“ctrl-z”(仅限 Windows,类 unix 系统使用 ctrl-d)。当您测试这样的小程序时应该可以帮助您 - 无需输入无效字符。

        【讨论】:

        • 在类 Unix 系统上是 Ctrl-d。
        【解决方案5】:

        在每个数字后提示用户或提前进行数字计数并相应地循环。 这不是一个好主意,但我在许多应用程序中都看到了这一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-12
          • 2013-11-20
          相关资源
          最近更新 更多