从字符串中提取整数

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/

【讨论】:

以上是关于从字符串中提取整数的主要内容,如果未能解决你的问题,请参考以下文章

从字符串中提取单个(无符号)整数

从字符串 C++ 中提取某些整数

如何从字符串中提取数字并获取整数数组?

从字符串中提取带空格的整数

从具有任意结构的 C++ 中的字符串中提取整数

从字符串S中提取每个位置的整数[重复]