遍历一串字符并提取数字?
Posted
技术标签:
【中文标题】遍历一串字符并提取数字?【英文标题】:going through a string of characters and extracting the numbers? 【发布时间】:2010-03-06 12:09:29 【问题描述】:给定一串字符,我怎样才能遍历它并将该字符串中的所有数字分配给一个整数变量,而忽略所有其他字符?
我想在已经通过gets()
读入的字符串时执行此任务,而不是在读取输入时执行此任务。
【问题讨论】:
您可能会读到为什么gets()
不好”:faq.cprogramming.com/cgi-bin/…。 - 另外,“12xyz34”会导致:12 还是 1234?
小心 - 只有当输入字符串中的数字在组合时不会溢出 int 类型时才会起作用。
【参考方案1】:
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;
【讨论】:
这很好,但是......如果该值超过了 unsigned int 类型的最大数量怎么办?【参考方案2】:这是一种简单的 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;
【讨论】:
【参考方案3】:从标准 C 库中查找 strtol
function。它允许您找到字符数组中为数字的部分,并指向第一个不是数字的字符并停止解析。
【讨论】:
【参考方案4】:您可以使用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;
【讨论】:
以上是关于遍历一串字符并提取数字?的主要内容,如果未能解决你的问题,请参考以下文章