IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Comment extraire une chaine de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    Par défaut Comment extraire une chaine de caractères
    Bonjour à tous,

    J'ai besoin d'extraire une chaine de caractere qui est separe par des espace comme on oeut le faire , en PHP, avec explode()

    J'ai declaré une variable

    Je recupere un chaine de caractere dans un variable de type char.
    La chaine est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char inSerial[20];
    ... code...
    Serial.print(serial)
    le Serial.print() affiche
    dirw3 +415678 toto
    J'ai besoin de recupérer "+415678"

    Comment puis-je recupérer +415678 proprement?

    Y a t il une fonction qui me permets de le faire?

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Si tu veux la récupérer sous la forme d'une chaine de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       char inSerial[] = "dirw3 +415678 toto"; 
       char res[20];
       sscanf(inSerial,"%*s%s",res);  // res = "+415678"
    et sous la forme d'un entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       char inSerial[] = "dirw3 +415678 toto"; 
       int i;
       sscanf(inSerial,"%*s%d",&i);  // i = 415678

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    Par défaut
    Salut Diogene

    Merci beaucoup pour ton aide, mais malheureusement ca ne marche pouas .

    Mais ca me semble très proche et c'est vraiment mieux qu'avant.

    Voici comment j'ai reproduit ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
        if(!strncmp(inSerial,"dirw",4)){
          #ifdef DEBUG
            Serial.println(F("\nWRITING TO THE DIRECTORY"));
            Serial.println(F("--------------------------------"));
            Serial.println(F("Script not ready yet!"));
          #endif
     
           if(inSerial[4] >= '1' && inSerial[4] <= '9') {
     
             char nu[PHONESIZE]; // PHONESIZE = 20
     
             sscanf(inSerial,"%*s%",nu);
             /* ANCIEN CODE POUR L?EXTRACTION
            char* nu="\0";
            for(byte i=0; i < 25; i++){
              if(i > 5){
                //Serial.print(inSerial[i]);
                //strcat(nu,(const char *)inSerial[i]);
                nu=nu+inSerial[i];
                if(inSerial[i]  == ' ' || inSerial[i]  == '\0'){
                  Serial.println(F("\nOut"));
                  break;
                }
              }
            }
            */
            Serial.print(F("Valeur extraite : "));
              Serial.println(nu);
     
          } else {
              Serial.println(F("Entrer une valeur entre 1 et 9")); // pas bon
          }
     
          Serial.println("");
     
          #ifdef DEBUG
            enterCommand();
           #endif
     
        }
    nu m'affiche
    Valeur extraite : \ëÇ8P
    alors que j'ai taper dans mpon terminal
    Si je tape (ce qui plus proche a ce que l'utilisateur tapera, puisqu'il s'agit de recupérer le numero de téléphone entrer par l'utilisateur pour l'enregistrer numéro dans une position du directory)

    "dirw2 +41221234567" ou
    "dirw2 +41221234567 toto"

    Il me retourne la meme chose
    Valeur extraite : \ëÇ8P

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Autant faudrait-il recopier la bonne chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(inSerial,"%*s%s",nu);
    La première partie %*s avec l'étoile signifie que l'on ignore le premier mot (ici dirw3).
    Puis on lit notre deuxième +415678 avec %s.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    Par défaut
    Oups!
    Super ça marche!!!!!

    Merciiiiii.

    J'aimerais juste comprendre un truc. Qu'es-ce qui dit que les espaces sont les délimiteur.

    Et si je voulais faire plus compliqué en voulant aussi récupérer "toto", je suis sur que plus tard, j'en aurai besoin

    dirw3 +41221234567 toto

  6. #6
    Invité
    Invité(e)
    Par défaut
    Il suffit de simplement rajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(inSerial,"%*s%s%s",nu, toto);
    N'hésite pas à lire la page man ainsi que le tutoriel Scanf démythifiée où tu y verras entre autres :
    s
    Correspond à une séquence de caractères différents des caractères blancs. Le pointeur correspondant doit être du type char *, et la chaine doit être assez large pour accueillir toute la séquence, ainsi que le caractère NUL final. La conversion s'arrête au premier caractère blanc, ou à la longueur maximale du champ.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    Par défaut
    Ok super,

    Milles mercis. Ca fonctionne.

    Oufffsss

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Comment inverser une chaine de caractères ?
    Par just1980 dans le forum Contribuez
    Réponses: 6
    Dernier message: 01/05/2011, 20h35
  2. Comment extraire une chaine de caractère?
    Par moiguigui60 dans le forum C#
    Réponses: 6
    Dernier message: 03/11/2010, 11h46
  3. Réponses: 2
    Dernier message: 03/10/2005, 16h23
  4. Réponses: 2
    Dernier message: 14/01/2005, 15h40
  5. comment vider une chaine de caractère
    Par gaut dans le forum C
    Réponses: 13
    Dernier message: 12/09/2003, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo