字符串到数字(int类型的矢量数组)的转换



函数将包含逗号(,(分隔数字的字符串作为字符串,并转换为数字。有时它会在最后产生一个垃圾值。

vector<int> parseInts(string str)
{
int as[200]={0};
int i=0,j=0;
for(;str[i]!='';i++)
{  
while(str[i]!=','&&str[i]!='')
{as[j]= as[j]*10 +str[i] -'0';
i++;}
j++;
}

vector<int>rr;
for(int i=0;i<j;i++)
rr.push_back(as[i]);
return rr;
}

如果您使用C++编写,请使用C++功能而不是C风格的字符串操作。您可以将std::istringstreamstd::getline()std::stoi()组合成一个非常短的解决方案。(还要注意,您应该通过const引用来获取参数,因为您不会修改它。(

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
std::vector<int> parseInts(std::string const & str) {
std::vector<int> values;
std::istringstream src{str};
std::string buf;

while (std::getline(src, buf, ',')) {
// Note no error checking on this conversion -- exercise for the reader.
values.push_back(std::stoi(buf));
}

return values;
}

(演示(

该代码不处理空格和超过200个数字的输入。

另一种工作解决方案:

#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <vector>
std::vector<int> parseInts(std::string s) {
std::replace(s.begin(), s.end(), ',', ' ');
std::istringstream ss(std::move(s));
return std::vector<int>{
std::istream_iterator<int>{ss},
std::istream_iterator<int>{}
};
}
int main() {
auto v = parseInts("1,2    , 3 ,,, 4,5,,,");
for(auto i : v)
std::cout << i << 'n';
}

输出:

1
2
3
4
5

你从来没有真正问过问题。如果你正在寻找一种优雅的方法,那么我在下面提供。如果您要求我们调试代码,那就另当别论了。

首先,这里有一个很好的工具来分割字符串

std::vector<std::string> split(const std::string& str, char delim) {
std::vector<std::string> strings;
size_t start;
size_t end = 0;
while ((start = str.find_first_not_of(delim, end)) != std::string::npos) {
end = str.find(delim, start);
strings.push_back(str.substr(start, end - start));
}
return strings;
}

首先用逗号分隔字符串:

std::vector<std::string> strings = split(str, ',');

然后将每个转换为int

std::vector<int> ints;
for (auto s : strings)
ints.push_back(std::stoi(s))

最新更新