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 :

Identifier une chaine de caractere présente dans une autre .


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut Identifier une chaine de caractere présente dans une autre .
    Bonjour,

    Je dispose de 2 chaines de caracteres chacune stockées dans un tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned char phone_number_ok1[10+1]="0610111213";
    unsigned char uart_buffer[50];
    Lorsque je programme tourne, uart_buffer se rempli de caractères de la façon suivante et eventuellement, il contiendra le numéro de téléphone justement recherché :

    \r\n+CLIP: "0610111213",129,"",128,"",0


    Afin de voir si le contenu de phone_number est bien présent dans uart_buffer, j'ai écris ceci mais ça ne fonctionne pas :

    Mon but est le mettre un flag à "1" et allumer une Led si le numéro recherché est bien présent dans le buffer reçu.

    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
    void identify_phone_number(void);
     
    void identify_phone_number(void)
    {
        if (strstr (uart_buffer,phone_number_ok1) == 0)
        {
        LED1_IO = 0;
    	num1_detected = 0;
        }
    	else 
    	{
    	LED1_IO = 1;
    	num1_detected = 1;
    	}
    }
    Je ne vois pas ou se situe le problème.
    Je vous remercie de votre aide,

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Quelques-pistes à vérifier:

    1/ Es-tu certain que tes buffer ont les valeur que tu attend?
    -> peux-tu les afficher avant le if et vérifier ou utiliser un debugger pour voir leur contenu?

    2/ Le bout de code que tu montre me semble ok.

    -> Le problème viens peu-être du dessus, tu appelle peut être la procédure trop tôt avant que ton buffer soit rempli et contienne le numéro par exemple, ou trop tard et tu a vidé ton buffer pour mettre autre chose dedans.
    ou plusieurs fois avec des valeurs de buffer différentes dont les dernières ne contiennent pas le numéro et donc éteignent tes led.

    bref il faut vérifier si tu appelle ta procédure et si c'est au bon moment.

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Note,
    Sorti de son contexte ton code marche.

    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
     
    #include <stdio.h>
     
    unsigned char phone_number_ok1[10+1]="0610111213";
    unsigned char uart_buffer[50] = 
    {  '\r','\n','+','C','L','I','P',':',' ','"','0','6','1','0','1','1','1','2','1','3','"',',','1','2','9',',','"','"',',','1','2','8',',','"','"',',','0',0};
     
    unsigned int  LED1_IO = 0;
    unsigned int  num1_detected = 0;
     
    void identify_phone_number(void)
    {
      if (strstr (uart_buffer,phone_number_ok1) == 0) {
          LED1_IO = 0;
          num1_detected = 0;
        } else {
          LED1_IO = 1;
          num1_detected = 1;
        }
    }
     
    void display(void) { 
     
      printf(" LED1_IO = %d, num1_detected = %d\n",
             LED1_IO,num1_detected);
    }
     
    int main(void) { 
     
      printf("%s \n %s \n",phone_number_ok1,uart_buffer);
      display();
      identify_phone_number();
      display();
      return 0;
    }
    0610111213

    +CLIP: "0610111213",129,"",128,"",0
    LED1_IO = 0, num1_detected = 0
    LED1_IO = 1, num1_detected = 1
    Donc le souci viens d'ailleurs.

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    En effet, le code fonctionne j'avais quelque part ailleurs dans mon programme une remise à zéro de la LED , donc cela explique pourquoi je ne voyais pas celle s'allumer lorsque la condition était réalisée.

    Merci de m'avoir aidé, c'est sympa.

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Je rencontre un nouveau problème à présent :

    Je voudrai vérifier que L'UN des numéros est bien présent dans le buffer.
    Les numéros à vérifier sont contenus dans des tableaux respectifs.

    Pour cela, j'ai écris ceci, mais ça ne fonctionne pas, la condition n'est jamais vérifiée alors buffer contient bien l'un des numéros cités.

    La condition devrait pourtant se vérifier car je fais un OU logique.

    Actuellement, à chaque fois c'est la boucle : LED1_IO = 1; qui est exécutée ...

    Pourriez vous me dire ce qu'il ne va pas svp ?



    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
    unsigned char num1[10+1]="0607080910";
    unsigned char num2[10+1]="0611121314";
    unsigned char num3[10+1]="0615161718";
    unsigned char num4[10+1]="0619202122";
     
    ...
     
    if ((strstr (buffer, num1) == 0) || (strstr (buffer, num2) == 0) || (strstr (buffer, num3) == 0) || (strstr (buffer, num4) == 0))
        {// phone number not found in the list, do :
        LED1_IO = 1;
        }
    	else 
    	{// phone number found in the list, do :
    	LED2_IO = 1;
    	}

    D'ailleurs, peut être existerait t-il un moyen plus judicieux ou plus simple de procéder ?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((strstr (buffer, num1) == 0) || (strstr (buffer, num2) == 0) || (strstr (buffer, num3) == 0) || (strstr (buffer, num4) == 0))
    1) La fonction strstr() renvoie un pointeur sur le début de la sous-chaîne, ou NULL si celle-ci n'est pas trouvée.

    2) Aucun numéro n'est trouvé seulement dans le cas où les 4 conditions sont fausses. Il faut donc utiliser l'opérateur && (ET) et non || (OU).

    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((strstr (buffer, num1) == NULL) && (strstr (buffer, num2) == NULL) && (strstr (buffer, num3) == NULL) && (strstr (buffer, num4) == NULL))

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 19/04/2011, 16h30
  2. Identifier les caracteres speciaux dans une chaine de caracteres
    Par NicaeaCivitas dans le forum Développement
    Réponses: 2
    Dernier message: 18/01/2011, 17h06
  3. Réponses: 9
    Dernier message: 06/11/2007, 13h36
  4. Réponses: 1
    Dernier message: 22/10/2007, 15h02
  5. recuperer certains temes dans une chaine de caractere
    Par leviathan516 dans le forum ASP
    Réponses: 2
    Dernier message: 15/10/2004, 11h42

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