web-dev-qa-db-fra.com

Comment extraire les nombres d'une chaîne en c?

Disons que j'ai une chaîne comme ab234cid*(s349*(20kd et que je veux extraire tous les nombres 234, 349, 20, que dois-je faire?

14
CDT

Vous pouvez le faire avec strtol , comme ceci:

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++;
    }
}

Lien vers ideone .

23
dasblinkenlight

Une solution possible en utilisant sscanf() et les ensembles d’analyses:

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] signifie ignorer la saisie jusqu'à ce qu'un chiffre soit trouvé. Voir la démo sur http://ideone.com/2hB4UW .

Ou, si le nombre de nombres est inconnu, vous pouvez utiliser le spécificateur %n pour enregistrer la dernière position lue dans la mémoire tampon:

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);
}
13
hmjd

ici après une solution simple utilisant 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';

    }
}
2
MOHAMED

Si les nombres sont séparés par des espaces dans la chaîne, vous pouvez utiliser sscanf (). Depuis, ce n’est pas le cas avec votre exemple, vous devez le faire vous-même:

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

}

1
P.P.

Créez une machine à états qui fonctionne sur un principe de base: le caractère actuel est-il un nombre? 

  • Lorsque vous passez d'un chiffre à un autre, vous initialisez votre numéro actuel: = numéro. 
  • lors du passage de chiffre en chiffre, vous "déplacez" le nouveau chiffre dans:
    current_number: = current_number * 10 + number;
  • lors de la transition de chiffre à non-chiffre, vous sortez le current_number
  • de non-chiffre à non-chiffre, vous ne faites rien.

Les optimisations sont possibles.

1
Aki Suihkonen
#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++;
    }
}

}
0
Felix

Ou vous pouvez créer une fonction simple comme ceci:

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