如何从c中的字符串中提取数字?

时间:2012-11-15 14:29:52

标签: c string

假设我有一个像ab234cid*(s349*(20kd这样的字符串,我想提取所有数字234, 349, 20,我该怎么办?

7 个答案:

答案 0 :(得分:24)

您可以使用strtol执行此操作,如下所示:

char *str = "ab234cid*(s349*(20kd", *p = str;
while (*p) { // While there are more characters to process...
    if ( isdigit(*p) || ( (*p=='-'||*p=='+') && isdigit(*(p+1)) )) {
        // Found a number
        long val = strtol(p, &p, 10); // Read number
        printf("%ld\n", val); // and print it.
    } else {
        // Otherwise, move on to the next character.
        p++;
    }
}

链接到ideone

答案 1 :(得分:13)

使用sscanf()和扫描集的可能解决方案:

const char* s = "ab234cid*(s349*(20kd";
int i1, i2, i3;
if (3 == sscanf(s,
                "%*[^0123456789]%d%*[^0123456789]%d%*[^0123456789]%d",
                &i1,
                &i2,
                &i3))
{
    printf("%d %d %d\n", i1, i2, i3);
}

其中%*[^0123456789]表示在找到数字之前忽略输入。请参阅http://ideone.com/2hB4UW上的演示。

或者,如果数字的数量未知,您可以使用%n说明符记录缓冲区中读取的最后位置:

const char* s = "ab234cid*(s349*(20kd";
int total_n = 0;
int n;
int i;
while (1 == sscanf(s + total_n, "%*[^0123456789]%d%n", &i, &n))
{
    total_n += n;
    printf("%d\n", i);
}

答案 2 :(得分:2)

使用sscanf

后的简单解决方案
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char str[256]="ab234cid*(s349*(20kd";
char tmp[256];

int main()
{

    int x;
    tmp[0]='\0';
    while (sscanf(str,"%[^0123456789]%s",tmp,str)>1||sscanf(str,"%d%s",&x,str))
    {
        if (tmp[0]=='\0')
        {
            printf("%d\r\n",x);
        }
        tmp[0]='\0';

    }
}

答案 3 :(得分:1)

如果数字由字符串中的空格分隔,则可以使用sscanf()。既然如此,你的例子并非如此, 你必须自己做:

char tmp[256];

for(i=0;str[i];i++)
{
  j=0;
  while(str[i]>='0' && str[i]<='9')
  {
     tmp[j]=str[i];
     i++;
     j++;
  }
  tmp[j]=0;
  printf("%ld", strtol(tmp, &tmp, 10));
  // Or store in an integer array

}

答案 4 :(得分:1)

创建一个基于一个基本原则运行的状态机:当前字符是数字。

  • 从非数字转换为数字时,初始化current_number:= number。
  • 当从数字转换为数字时,您将“移位”新数字:
    current_number:= current_number * 10 + number;
  • 从数字转换为非数字时,输出current_number
  • 从非数字到非数字时,您什么都不做。

可以进行优化。

答案 5 :(得分:0)

或者你可以制作一个这样的简单函数:

// Provided 'c' is only a numeric character
int parseInt (char c) {
    return c - '0';
}

答案 6 :(得分:0)

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
void main(int argc,char *argv[])
{
char *str ="ab234cid*(s349*(20kd", *ptr = str;
while (*ptr) { // While there are more characters to process...
    if ( isdigit(*ptr) ) {
        // Found a number
        int val = (int)strtol(ptr,&ptr, 10); // Read number
        printf("%d\n", val); // and print it.
    } else {
        // Otherwise, move on to the next character.
        ptr++;
    }
}

}