从字符串中仅提取整数

时间:2019-04-24 21:40:22

标签: c++

我想从某个字符串中提取整数,以便对其执行数学运算。

例如字符串

  

25 1 3; 5 9 2; 1 3 6

我只想提取

  

25、1、3、5、9、2、1、3、6

有办法吗?

4 个答案:

答案 0 :(得分:0)

有许多种方法可以做到这一点。例如,您可以使用<regex>并选择它们,但是我认为从字符串流中提取将更容易。

void extractIntegerWords(string str)
{
  stringstream ss;

  /* Storing the whole string into string stream */
  ss << str;

  /* Running loop till the end of the stream */
  string temp;
  int found;

  while (!ss.eof()) {

    /* extracting word by word from stream */
    ss >> temp;

    /* Checking the given word is integer or not */
    if (stringstream(temp) >> found)
        cout << found << " ";

    /* To save from space at the end of string */
    temp = "";
  }
}

// Driver code 
int main()
{
  string str = "25 1 3; 5 9 2; 1 3 6";
  extractIntegerWords(str);
  return 0;
}

从此处获取的代码:Extract integers from string

答案 1 :(得分:0)

如果要从具有任何内容的字符串中提取它们(您不知道其他字符是什么),可以使用 stringstream

例如,假设数字为 int ,并且希望将提取的 int 放在列表中:

#include <sstream>
#include <iostream>
#include <string>
#include <list>

int main(int argc, char ** argv)
{
  if (argc == 2) {
    std::stringstream iss(argv[1]);
    std::list<int> l;

    for (;;) {
      int v;

      if (iss >> v)
        // ok read an int
        l.push_back(v);
      else {
        // was not an int, clear error
        iss.clear();

        // try to read a string to remove non digit
        std::string s;

        if (!(iss >> s))
          // EOF, end of the initial string
          break;
      }
    }

    for (auto v : l)
      std::cout << v << ' ';
    std::cout << std::endl;
  }

  return 0;
}

编译和执行:

pi@raspberrypi:~ $ g++ -pedantic -Wall -Wextra c.cc
pi@raspberrypi:~ $ ./a.out "25 1 3; 5 9 2; 1 3 6"
25 1 3 5 9 2 1 3 6 
pi@raspberrypi:~ $

请注意,解决方案“ 123 a12 13”将产生123和13,而不是123 12 13。

要从“ 123 a12 13”生成123 12 13,只需在发生错误的情况下读取字符而不是字符串即可:

#include <sstream>
#include <iostream>
#include <string>
#include <list>

int main(int argc, char ** argv)
{
  if (argc == 2) {
    std::stringstream iss(argv[1]);
    std::list<int> l;

    for (;;) {
      int v;

      if (iss >> v)
        l.push_back(v);
      else {
        iss.clear();

        char c;

        if (!(iss >> c))
          break;
      }
    }

    for (auto v : l)
      std::cout << v << ' ';
    std::cout << std::endl;
  }

  return 0;
}

编译和执行:

pi@raspberrypi:~ $ g++ -pedantic -Wall -Wextra c.cc
pi@raspberrypi:~ $ ./a.out "25 1 3; 5 9 2; 1 3 6"
25 1 3 5 9 2 1 3 6 
pi@raspberrypi:~ $ ./a.out "123 a12 13"
123 12 13 

答案 2 :(得分:0)

一种通过解决方案可以扫描字符串以查找范围,该范围从下一个可用的数字开始,然后在存在非数字字符的地方停止。然后从该范围内的字符创建一个整数,并继续直到到达字符串的末尾。

apt-cache show jupyter-notebook

示例:

vector<int> extract_ints( std::string const& str ) {
  auto& ctype = std::use_facet<std::ctype<char>>(std::locale{});
  auto p1 = str.data(), p2 = str.data();

  vector<int> v;
  for (auto e = &str.back() + 1; p1 < e; p1++) {
    p1 = ctype.scan_is( ctype.digit, p1, e );
    p2 = ctype.scan_not( ctype.digit, p1 + 1, e );
    int x = 0;
    while (p1 != p2) {
      x = (x * 10) + (*p1 - '0');
      p1++;
    }
    v.push_back(x);
  }
  return v;
}

输出:

auto v = extract_ints("[1,2,3]");
for (int i=0; i<v.size(); i++)
  cout << v[i] << " ";

答案 3 :(得分:0)

我只用String Toolkit来解析字符串,使用空格,方括号和分号作为分隔符。

我已经回答了Extract Data from a line之前的问题

我将下面的代码解释为:

#include <strtk.hpp>   // http://www.partow.net/programming/strtk

std::string src = "[25 1 3; 5 9 2; 1 3 6]";

std::string delims(" [];");

std::vector<int> values;

strtk::parse(src, delims, values );

// values will contain all the integers in the string.
// if you want to get floats & integers the vector needs to be float