遍历一串字符并提取数字?

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;


编辑:这是一个更安全的函数版本。 如果 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;

【讨论】:

这很好,但是......如果该值超过了 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;

【讨论】:

以上是关于遍历一串字符并提取数字?的主要内容,如果未能解决你的问题,请参考以下文章

js中如何把一串数字转换为数组

循环遍历 R 中的列并提取字符

C# windows应用程序中,如何从文本框TextBox中提取数字?

c语言一串字符串中提取数字并相加的问题

PHP循环遍历多维数组并更改值

JAVA编程题目: ArrayList存储任意三个字符串,并遍历(迭代器遍历)