Peut on extraire une partie uniquement d'une chaine de caracter

Bonjour,

J'arrive recupérer cette valeur

char test[20];
char = "dirw3 +2209876789"

Y a t il une fonction qui me permets de me récupérer tout ce qu'il y a apres l'espace, soit

+2209876789

et s'il y avait un espace apres le 9, il ne prend rien de plsu que jusqu'au 9?

En PHP, il y a la fonction explode() en passant comme delilioteur l'espace. Et il me place toutes les valeurs dans un array.
Peut on faire une truc du genre aussi, avec Arduino?

J0'ai aussi essayé de comparé comme ceci

dirw4 rrrrrrr eee

Mon but étant d'extraire "rrrrrrr"

char inSerial[]="dirw4 rrrrrrr eee"
char nu[20];
for(int i=0; i<20; i--){
          
          if(i > 4){ // Je commance à la position 5 (l'expace)
            Serial.print(inSerial[i]); // J'affiche les caracter
            
strcat(nu,inSerial[i]);  // Ca ca ne marche pas nom plus PORTANT c est deux char?
          
            if(inSerial[i] == " " || inSerial[i] == "\0"){ // Des que je rencontre un espace, je sors de ma boucle, mais il n'accèpte pas la comparaison???
              break;
            }
          
        }
}
Serial.println(nu); /Ca devrait afficher "rrrrrrrr"

tu peut t'en sortir en utilisant les fonctions strtok() ou sscanf(), ou une combinaison des deux.
La première fonction est vraiment tres chiante a utiliser

/****************************************************/
/*         Exemple d'utilisation de strtok          */
/*  Découper une chaine selon un certain séparateur */
/****************************************************/

// dans le code suivant on découpe avec l'espace
// mais on peut remplacer l'espace en lignes 34 et 46
// par n'importe quel autre caractère
// ou même chaine de caractères

#include <stdio.h>
//#include <stdlib.h>
#include <string.h>

const int Taille = 200;

int main (void)
{
    char phrase[Taille + 1] = "toto va a la plage"; // la chaine à découper
         // on découpe selon les espaces
    char tabMots[100][Taille + 1]={""}; // tabMots contient 100 mots vides
       // un tableau d'au plus 100 chaines de taille maxi Taille
       // il va nous servir à recevoir les mots de la chaine découpée
       // à la fin du processus de découpage il aura l'allure suivante :
       // toto
       // va
       // a
       // la
       // plage
    char * p; // un pointeur interne qui va servir à la fonction de découpage
    int i;  
    
       
    p=strtok(phrase," "); // p vaut le premier mot (toto)
    strcpy(tabMots[0],p); // on copie toto dans la première ligne de tabMots
       // le premier appel à strock va chercher le premier mot avant l'espace
       // on copie ce mot (toto) dans le tableau tabMots en première ligne
       // A la fin de l'instruction strtok a laissé en mémoire le pointeur p
       // sur le début du mot suivant (va)
       // Les appels suivants de strtok dans la boucle ci-dessous utilisent
       // ce pointeur interne d'où la présence de NULL dans la ligne 46
    
    i=1;
    while (p!=NULL)
        {
            p=strtok(NULL," ");
                // on cherche un nouveau mot à partir de la position courante
                // de p
            if (p!=NULL) // si on a trouvé un nouveau mot
                {
                    strcpy(tabMots[i],p);
                    // on le copie dans le tableau en i ème ligne
                    i++; // on se prépare pour le mot suivant
                }
        } // fin de while
    
    // affichage
    for (i=0;i<100 && tabMots[i][0]!=0;i++) printf("\nMot %d : %s",i,tabMots[i]);
    
    fflush(stdin);getchar();   
} // fin de main

juste histoire de dire que des fois tu peux trouver l'info facilement et plus vite

regarde ce qui se dit sur strtok()
:wink:

Bonjour,

Pourquoi sortir les tanks (strtok et sscanf) pour si peu :wink:
Deux boucles et un pointeur suffit !

char test[] = "abc 123 def"; // La chaine de char d'origine
char *ptr = test; // Le pointeur vers le début de ta sous chaine (si elle existe)

// Avance le pointeur ptr jusqu'au premier espace, puis le saute
while(*ptr != ' ' && *ptr != '\0') ++ptr;
if (*ptr != '\0')
  ++ptr;
else
  return; // Si fin de chaine = pas de sous chaine trouvé -> return

// Cherche l'espace suivant puis le remplace par un \0 (fin de chaine)
while(*ptr != ' ' && *ptr != '\0') ++ptr;
if (*ptr != '\0') *ptr = '\0';

// ptr pointe désormais sur le morceau "123"

J'ai détaillé, mais en réalité ça fait 4 lignes de code :wink: