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

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

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

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

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

 #include  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; } 

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

 #include  #include  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; } } 

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

您可以使用sscanf :它的工作方式与scanf类似,但在字符串(char数组)上。

sscanf可能对你想要的东西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; }