我想将带有整数和空格的字符串读入数组。例如,我有一个字符串看起来像1 2 3 4 5,我想将它转换为整数数组arr [5] = {1,2,3,4,5}。我该怎么做?
我试图删除空格,但只是将整个12345分配到每个数组元素中。如果我没有,那么所有元素都将被分配1。
for (int i = 0; i < str.length(); i++){
if (str[i] == ' ')
str.erase(i, 1);
}
for (int j = 0; j < size; j++){ // size is given
arr[j] = atoi(str.c_str());
}
答案 0 :(得分:2)
几点说明:
std::vector
。在编译时,您很可能永远不会知道输入的大小。如果您这样做,请使用std::array
。stoi
或stol
,因为它们会导致转换失败std::stringstream
完成任务,这样您就可以将std::string
视为std::istream
std::cin
。我推荐这种方式std::string
将' '
标记为分隔符,这就是你想要做的事情。std::vector<int> ReadInputFromStream(const std::string& _input, int _num_vals)
{
std::vector<int> toReturn;
toReturn.reserve(_num_vals);
std::istringstream fin(_input);
for(int i=0, nextInt=0; i < _num_vals && fin >> nextInt; ++i)
{
toReturn.emplace_back(nextInt);
}
// assert (toReturn.size() == _num_vals, "Error, stream did not contain enough input")
return toReturn;
}
std::vector<int> ReadInputFromTokenizedString(const std::string& _input, int _num_vals)
{
std::vector<int> toReturn;
toReturn.reserve(_num_vals);
char tok = ' '; // whitespace delimiter
size_t beg = 0;
size_t end = 0;
for(beg = _input.find_first_not_of(tok, end); toReturn.size() < static_cast<size_t>(_num_vals) &&
beg != std::string::npos; beg = _input.find_first_not_of(tok, end))
{
end = beg+1;
while(_input[end] == tok && end < _input.size())
++end;
toReturn.push_back(std::stoi(_input.substr(beg, end-beg)));
}
// assert (toReturn.size() == _num_vals, "Error, string did not contain enough input")
return toReturn;
}
答案 1 :(得分:0)
您的代码arr[j] = atoi(str.c_str());
是错误的。 str
是string
,而非char
。使用atoi(const char *)
时,您应该提供&char
参数。所以正确的代码是arr[j] = atoi(&str[j])
。顺便说一句,如果您想将string
更改为int
,则可以使用函数arr[j] = std::stoul(str)
。我希望这可以帮到你。
答案 2 :(得分:0)
您已在一个循环中修改/解析字符串,但在另一个循环中复制到整数数组。没有设置任何标记,其中字符串中的所有嵌入整数开始/结束。所以我们必须在单循环中执行这两个操作。 这段代码并不完美,但是给你一些想法;遵循您遵循的相同过程,但使用了矢量。
string str = "12 13 14";
vector<int> integers;
int start=0,i = 0;
for (; i < str.length(); i++){
if (str[i] == ' ')
{
integers.push_back(atoi(str.substr(start,i).c_str()));
start = i;
}
}
integers.push_back(atoi(str.substr(start,i).c_str()));