从字符串中提取整数

时间:2013-06-07 15:13:58

标签: c++ string int

从字符串中提取整数并将它们保存为整数数组的最佳和最短方法是什么?

样本字符串“65 865 1 3 5 65 234 65 32#$!@#”

我试过看一些其他帖子但找不到关于这个特定问题的帖子...... 一些帮助和解释会很棒。

4 个答案:

答案 0 :(得分:3)

似乎这一切都可以通过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;
}

答案 1 :(得分:0)

由于这里的分隔符很复杂(你似乎有空格和非数字字符)我会使用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++);
}

所以你可以看到我把它缩小为字符串列表。如果您需要对整数数组执行整个步骤(不确定您想要的数组类型),请告诉我们;如果你想采取提升方式,也很乐意将其包括在内。

答案 2 :(得分:0)

您可以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是否成功。

答案 3 :(得分:0)

我喜欢将istringstream用于此

istringstream iss(line);
iss >> id;

由于它是一个流,您可以像cin一样使用它。默认情况下,它使用空格作为分隔符。您可以简单地将其包装在循环中,然后将生成的string转换为int

http://www.cplusplus.com/reference/sstream/istringstream/istringstream/