从字符串中提取整数
Posted
技术标签:
【中文标题】从字符串中提取整数【英文标题】:Extraction of integers from strings 【发布时间】:2013-06-07 15:13:58 【问题描述】:并将它们保存到整数数组中的最佳和最短方法是什么?
示例字符串“65 865 1 3 5 65 234 65 32 #$!@#”
我尝试查看其他一些帖子,但找不到有关此特定问题的帖子... 一些帮助和解释会很棒。
【问题讨论】:
您的字符串是否总是以#
开头的非数字并放在字符串的末尾?
我的字符串实际上都是整数,但以一个非数字字符结尾,例如:“1 4 5 2 54 65 3246 53490 80 9 #”
试试看一下stringstream?或者从 topcoder 看这个教程?我想这样你可以了解更多:community.topcoder.com/…,这篇文章可能有用:***.com/questions/236129/splitting-a-string-in-c
【参考方案1】:
看来这一切都可以用std::stringstream
来完成:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
int main()
std::string str(" 65 865 1 3 5 65 234 65 32 #$!@#");
std::stringstream ss(str);
std::vector<int> numbers;
for(int i = 0; ss >> i; )
numbers.push_back(i);
std::cout << i << " ";
return 0;
这是一个解决数字之间非数字的解决方案:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
struct not_digit
bool operator()(const char c)
return c != ' ' && !std::isdigit(c);
;
int main()
std::string str(" 65 865 1 3 5 65 234 65 32 #$!@# 123");
not_digit not_a_digit;
std::string::iterator end = std::remove_if(str.begin(), str.end(), not_a_digit);
std::string all_numbers(str.begin(), end);
std::stringstream ss(all_numbers);
std::vector<int> numbers;
for(int i = 0; ss >> i; )
numbers.push_back(i);
std::cout << i << " ";
return 0;
【讨论】:
似乎在这种情况下单独使用stringstream
不起作用" 65 865 1 3 5 65 234 65 32 #$!@# 123"
啊,现在我明白了。我会将此解决方案添加到任何人需要它的底部包装中。【参考方案2】:
由于这里分隔符的复杂性(您似乎有空格和非数字字符),我会使用 boost 库中提供的字符串拆分:
http://www.boost.org/
这允许您使用正则表达式作为分隔符进行拆分。
首先,选择正则表达式的分隔符:
boost::regex delim(" "); // I have just a space here, but you could include other things as delimiters.
然后提取如下:
std::string in(" 65 865 1 3 5 65 234 65 32 ");
std::list<std::string> out;
boost::sregex_token_iterator it(in.begin(), in.end(), delim, -1);
while (it != end)
out.push_back(*it++);
所以您可以看到我已将其简化为字符串列表。让我知道您是否需要对整数数组执行整个步骤(不确定您想要什么数组类型);如果您想采用提升方式,也很高兴将其包括在内。
【讨论】:
它能满足 OP 的要求吗? 示例字符串“65 865 1 3 5 65 234 65 32 #$!@#”【参考方案3】:您可以使用stringstream 来保存您的字符串数据并将其读出 使用典型的 C++ iostream 机制转换成整数:
#include <iostream>
#include <sstream>
int main(int argc, char** argv)
std::stringstream nums;
nums << " 65 865 1 3 5 65 234 65 32 #$!@#";
int x;
nums >> x;
std::cout <<" X is " << x << std::endl;
// => X is 65
这将输出第一个数字,65。清理数据将是另一回事。你可以检查
nums.good()
查看读入 int 是否成功。
【讨论】:
【参考方案4】:我喜欢为此使用istringstream
istringstream iss(line);
iss >> id;
由于它是一个流,你可以像cin
一样使用它。默认情况下,它使用空格作为分隔符。您可以简单地将其包装在一个循环中,然后将生成的 string
转换为 int
。
http://www.cplusplus.com/reference/sstream/istringstream/istringstream/
【讨论】:
以上是关于从字符串中提取整数的主要内容,如果未能解决你的问题,请参考以下文章