通过一串字符并提取数字?

时间:2010-03-06 12:09:30

标签: c++ c string extraction

给定一串字符,如何通过它并将该字符串中的所有数字分配给整数变量,而忽略所有其他字符?

如果已经通过gets()读取了一串字符,我想执行此任务,而不是在读取输入时。

4 个答案:

答案 0 :(得分:3)

这是一种简单的C ++方法:

#include <iostream>
#include <sstream>
using namespace std;   

int main(int argc, char* argv[]) {

    istringstream is("string with 123 embedded 10 12 13 ints", istringstream::in);
    int a;

    while (1) {
        is >> a;
        while ( !is.eof() && (is.bad() || is.fail()) ) {
            is.clear();
            is.ignore(1);
            is >> a;
        }
        if (is.eof()) {
            break;
        }
        cout << "Extracted int: " << a << endl;
    }

}

答案 1 :(得分:3)

unsigned int get_num(const char* s) {
  unsigned int value = 0;
  for (; *s; ++s) {
    if (isdigit(*s)) {
      value *= 10;
      value += (*s - '0');
   }
  }
  return value;
}

编辑:这是一个更安全的功能版本。 如果sNULL,则返回0,或者根本无法将其转换为数值。如果字符串表示大于UINT_MAX的值,则返回UINT_MAX

#include <limits.h>

unsigned int safe_get_num(const char* s) {
  unsigned int limit = UINT_MAX / 10;
  unsigned int value = 0;
  if (!s) {
    return 0;
  }
  for (; *s; ++s) {
    if (value < limit) {
      if (isdigit(*s)) {
        value *= 10;
        value += (*s - '0');
      }
    }
    else {
      return UINT_MAX;
    }
  }
  return value;
}

答案 2 :(得分:0)

从标准C库中查找strtol function。它允许您查找字符数组中一个数字的部分,并指向第一个不是数字的字符并停止解析。

答案 3 :(得分:0)

您可以使用sscanf:它的作用类似于scanf,但是在字符串(字符数组)上。

sscanf可能对你想要的东西有点过分,所以你也可以这样做:

int getNum(char s[])
{
    int ret = 0;
    for ( int i = 0; s[i]; ++i )
        if ( s[i] >= '0' && s[i] <= '9' )
            ret = ret * 10 + (s[i] - '0');

    return ret;
}