C ++以'enter'命中结尾循环

时间:2018-11-19 20:27:59

标签: c++ arrays input iostream

我需要通过按Enter键来结束输入循环。试图找到一些东西,我在这里找一个人说下面的这段代码可以工作,可惜的是没有。怎么了?

#include <iostream>
#include <sstream>
using namespace std;
int main() {
    int a = 0, i=0;
    string line;
    getline(cin, line);
    stringstream linestr(line);
    int *tab = new int[line.size()/2+1]; 
    while ( linestr >> a ) 
    {
        tab[i]=a;
        i++;
    }

    for(int j=0; j<i; j++) cout<<tab[j]<<" ";
    return 0;
}

去吧,谢谢!

代码如下:

library(h2o)
h2o.init()
airlinedf <- h2o.importFile("http://s3.amazonaws.com/h2o-public-test-data/smalldata/airlines/allyears2k_headers.zip")
airlinemodel <- h2o.gbm(model_id = "airlinemodel",
                training_frame = airlinedf,
                x = c("Year", "Month", "DayofMonth", "DayOfWeek", "UniqueCarrier"),
                y = "IsDepDelayed",
                max_depth = 3,
                ntrees = 5)
h2o.download_mojo(airlinemodel, getwd(), FALSE)

3 个答案:

答案 0 :(得分:2)

问题

在您的代码中,您遇到分配问题,因为您为tab分配了一个整数。因此,一旦您阅读了第一个数字,您就会越界。这是未定义的行为。

此外,您的外部while会循环播放,直到输入空行(无数字)为止。

解决方案

如果您要在一行上读取几个数字,则无需循环:

getline(cin, line);
stringstream linestr(line);
vector<int> tab; 
while ( linestr >> a ) 
{
    tab.push_back(a);
}

此方法使用向量。这样的好处是,您不需要知道最后会有多少个数字。之后,您可以使用tab.size()找出向量的大小,并且可以像访问数组一样完全访问单个元素。

其他解决方案(次优)

如果是学校,则不允许使用向量,则可以选择次优替代方法:

int *tab = new int[line.size()/2+1];   

这估计了字符串中可能存在的最大数字数(您肯定会少一些)。

答案 1 :(得分:1)

一种实现方法如下:读取以空格分隔的数字并将其放入向量中。

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

int main() {
  std::string line;
  std::vector<int> v;
  std::getline(std::cin, line);
  std::stringstream sstream(line); 
  int i;
  while (sstream >> i) {
    v.push_back(i);
  }
  // Check your input vector.
  /*
  for(auto i : v){
    std::cout << i << std::endl;
  }
  */
}

示例输入:

32 22 62 723765 26 62 72 7 -5 7 2 7 152 62 6 262 72

答案 2 :(得分:1)

您的代码中的问题是您分配了足够的空间来容纳一个int

int *tab=new int;

并且正在使用tab,就好像它可以容纳所需的int一样。

如果允许您使用std::vector,请将上面的行更改为:

std::vector<int> tab;

并使用

while (getline(cin, line) && line.length() > 0) // line not empty
{
    stringstream linestr(line);
    while (linestr >> a)
    {
       tab.push_back(a);
    }
}

如果不允许使用std::vector,则必须弄清楚如何处理tab的动态性质。为了快速解决此问题,可以使用静态定义的数组,并在耗尽数组的容量后立即停止读取。

int const MAX_ELEMENTS = 100;
int tab[MAX_ELEMENTS];

...

while (getline(cin, line) && line.length() > 0 && i < MAX_ELEMENTS)
{
    stringstream linestr(line);
    while (linestr >> a)
    {
       tab[i] = a;
       ++i;        // Needs to be here not outside this loop.
    }
}