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 :

Trouver le commencement d'une chaine dans une autre avec strstr


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 Trouver le commencement d'une chaine dans une autre avec strstr
    Bonjour,

    Je rencontre un problème avec strstr que je sais pas résoudre.

    Mon but est d'identifier dans une chaine appelée buffer l'emplacement ou se trouve une autre chaine appelée RX_PWR

    Comme l'emplacement de RX_PWR peut varier à l'interrieur de buffer, je cherche mettre dans une variable int le début de la position de RX_PWD

    Mon code compile bien, mais lorsque je debug ma console m'indique que int pos_pwr est ' out of scope '

    Ainsi la valeur du pointeur ou débute RX_PWD ne se remplie pas dans le int.

    Pouvez vous m'aider 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
    16
    17
    18
    unsigned char RX_PWR[]="PWR:";
    unsigned char buffer[80];
    unsigned char puissance[9];
    int pos_pwr, i;
     
    ...
     
     
    		char* str = buffer;
    		char* str2 = strstr(str, RX_PWR);
    		pos_pwr = str2 - str;
     
     
    // On copie dans la chaine puissance le contenu de PWR + les 5 caractères suivants :
     
    		for (i=pos_pwr;i<8;i++)					
    		puissance[i-pos_pwr] = buffer[i];
    		puissance[pos_pwr]='\0';

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 306
    Points
    5 306
    Par défaut
    ststr() peut renvoyer NULL, donc utiliser directement la valeur de retour dans une soustraction de pointer sans vérifier, c'est jouer à la roulettre russe. car dans ce cas, la difference d'un adresse valide - NULL donnes une valeur tres grande ! et donc hors limite !

  3. #3
    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
    Merci,

    Cependant, au moment ou j'exécute ce code, je suis certain que PWR est bien dans la chaine, par contre je ne sais pas ou.

    Que me conseilles de faire ?

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i=pos_pwr;i<8;i++)
    Le test est faux si on veut copier 8 caractères à partir de buffer[]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    puissance[pos_pwr]='\0';
    est faux : pos_pwr donne l'indice du début de la chaine dans buffer[], pas l'indice de fin dans puissance[].
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i=pos_pwr;i<pos_pwr+8;i++) puissance[i-pos_pwr] = buffer[i];
    puissance[i-pos_pwr]='\0';
    // ou
    for (i=0;i<8;i++) puissance[i] = buffer[pos_pwr+i];
    puissance[i]='\0'

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je n'ai pas compris votre logique
    pos_pwr est la position de la chaine PWR dans buffer, donc peut aller de 0 (zéro) à strlen(buffer)-strlen(PWR) dans vore cas de 0 à 77 (au zéro terminal près).
    Si pos_pwr est supérieur ou égal à 8, puissance ne sera pas renseigné, par contre, l'écriture du zéro terminal causera un écrasement de mémoire.
    Moi, je ferais quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		for (i=0; i<strlen(str2); i++)					
    		  puissance[i] = buffer[pos_pwr+i];
    		puissance[i]='\0';
    // ou alors
      char* str3=str;
      for (i=0; i<pos_pwr+strlen(str2); i++)
        str3++;
      strcpy(puissance,str3);
    Si vous recherchez une valeur qui suit PWD, moi, je préfère une écriture de ce style
    ... n'importe quoi ... PWD= 25;
    C'est à dire qu'il y a deux séparateurs importants, le signe '=' qui suit EXACTEMENT le code et le ';' qui suit la valeur.

  6. #6
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    @Pierre Dolez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		for (i=0; i<strlen(str2); i++)					
    		  puissance[i] = buffer[pos_pwr+i];
    		puissance[i]='\0';
    Le PO ne dit pas de copier toute la fin de la chaine à partir du début de la chaine trouvée mais parle de 8 caractères. De plus, il y a de fortes chances que puissance[] soit alors trop petit.
    Il n'est pas non plus astucieux de placer l'appel à strlen() dans le test pour qu'il soit effectué inutilement à chaque boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // ou alors
      char* str3=str;
      for (i=0; i<pos_pwr+strlen(str2); i++)
        str3++;
      strcpy(puissance,str3);
    Comme pos_pwr est l'indice du début de str2, pos_pwr+strlen(str2) est l'indice de la fin de la chaine str
    Alors str3 pointe sur la fin de str !

  7. #7
    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
    Pouvez vous m'aider sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		char* str = buffer;
    		char* str2 = strstr(str, RX_PWR);
    		pos_pwr = str2 - str;
    Je voudrai pouvoir afficher pos_pwr mais le débugger voit cette variable comme
    ' out of scope '

    Pour pouvoir effectuer ensuite la copie de la puissance en fonction du placement de la chaine "PWR:" dans buffer, il faut que pos_pwr me retourne la bonne position de cette chaine.

    je n'arrive pas à afficher ou lire cette position du fait que le debugger la voit comme 'out of scope '

    Merci a vous,

  8. #8
    Invité
    Invité(e)
    Par défaut
    Tout à fait exact, je rectifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                   int max=min(strlen(str2),8);
                   for (i=0; i<max; i++)					
    		  puissance[i] = buffer[pos_pwr+i];
    		puissance[i]='\0';
    Par contre, pour le second code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // ou alors
      char* str3=str;  
      for (i=0; i<pos_pwr+strlen(str2); i++)
        str3++;
      strcpy(puissance,str3);
    J'ai fait l'hypothèse que cette manipulation avait pour but de lire ce qui SUIT les codes "PWD", donc, effectivement il faut que str3 points sur la fin de str2.
    Nos messages se sont croisés.

  9. #9
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    @Pierre Dolez
    J'ai fait l'hypothèse que cette manipulation avait pour but de lire ce qui SUIT les codes "PWD", donc, effectivement il faut que str3 points sur la fin de str2.
    La fin de str2 est aussi la fin de str ; str3 pointe sur le zéro terminal de la chaine de départ !!!

  10. #10
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    ....
    je n'arrive pas à afficher ou lire cette position du fait que le debugger la voit comme 'out of scope '
    Quel est le code exact que tu compiles ?

    Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(void)
    {
       char RX_PWR[]="PWR:";
       char buffer[80] = "abcdefPWR:123456789";
       char puissance[9];
     
        int pos_pwr, i;
        char* str = buffer;
        char* str2 = strstr(str, RX_PWR);
        pos_pwr = str2 - str;
        for (i=0;i<8;i++) puissance[i] = buffer[pos_pwr+i];
        puissance[i]='\0' ;
      return 0;
    }
    donne pour résultat pour puissance[] : "PWR:1234\0"

  11. #11
    Invité
    Invité(e)
    Par défaut
    @ diogène : exact, je me fais vieux. Mais j'ai vraiment dans la tête une fonction qui fait ça, et justement le but est de renvoyer un pointeur sur le caractère suivant de la chaine, et c'est justement ce que veut faire Icoulon.

  12. #12
    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 Diogene, le code fonctionne parfaitement.

    C'est juste que mon debugger n'est pas en mesure d'afficher le contenu de pos_pwr, je ne sais pas pourquoi, pour autant le résultat final est celui attendu.

    Je vous remercie tous de votre aide,

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

Discussions similaires

  1. Trouver une chaine dans une chaine
    Par zooffy dans le forum ASP.NET
    Réponses: 31
    Dernier message: 15/03/2011, 17h16
  2. recherche d'une chaine dans une chaine
    Par jpclutier dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 03/12/2007, 11h30
  3. Tester une chaine dans une chaine
    Par ulysse031 dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 26/03/2007, 00h48
  4. chercher caractére d'une chaine dans une chaine
    Par ulysse031 dans le forum Langage
    Réponses: 25
    Dernier message: 21/03/2007, 18h09
  5. Réponses: 2
    Dernier message: 19/10/2005, 15h38

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