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

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

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 .

Une solution possible en utilisant sscanf() et les ensembles d’ 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] signifie ignorer l’entrée 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); } 

ici après une solution simple utilisant sscanf :

 #include #include #include 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'; } } 

Si les nombres sont séparés par des espaces dans la chaîne, vous pouvez utiliser sscanf (). Comme 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 

}

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 du passage de chiffre à non-chiffre, vous sortez le current_number
  • de non-chiffre à non-chiffre, vous ne faites rien.

Les optimisations sont possibles.

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

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