我需要通过按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)
答案 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.
}
}