给定一串字符,如何通过它并将该字符串中的所有数字分配给整数变量,而忽略所有其他字符?
如果已经通过gets()
读取了一串字符,我想执行此任务,而不是在读取输入时。
答案 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;
}
编辑:这是一个更安全的功能版本。
如果s
为NULL
,则返回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;
}