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 une entete dans une chaine de caracteres pour la reformater


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 une entete dans une chaine de caracteres pour la reformater
    Bonjour

    J'utilise un compilateur pour du C embarqué.

    J'ai plusieurs chaines de caractères de différentes longueur mais toutes se terminent pas \0
    J'ai besoin de chercher une entete qui se trouve dans une chaine de caractères puis raccourcir cette dernière en lui supprimant l’entête.

    Par exemple, j'ai la chaine1 = "hfldkeoTOP5543";
    l'entete et le mot "TOP"

    Je voudrai localiser ce mot dans la chaine1, puis qu'ensuite chaine1 ne garde que se qui se trouve apres l'entete TOP , soit 5543.

    J'ai essayé avec strstr, mais je n'y parviens pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    unsigned char chaine[30] = "hfldkeoTOP5543";
    char * entete;
    entete = strstr(chaine1, "TOP");
    je pensai que entête contiendrait le chiffre 7 puisque le mot TOP débute au rang 7 mais ça n'est pas le cas .
    Pouvez vous m'aider svp ?

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

    Quand tu dis : " Je n'y arrive pas ", qu'entend-tu par là ?

    strstr renvoie un pointeur sur la location du commencement de la sous-chaîne dans la chaîne de base.
    En partant de cela, "il suffit" d'incrémenter le pointeur du nombre de caractère de la sous-chaîne recherché pour arriver au commencement de ce qui se trouve "après" cette sous-chaîne.

    Quand cela est fait, on copie dans la chaîne de base le contenu du nouveau pointeur (via strcpy).
    Dernière modification par Invité ; 18/11/2014 à 20h23.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par lcoulon Voir le message
    je pensai que entête contiendrait le chiffre 7 puisque le mot TOP débute au rang 7 mais ça n'est pas le cas .
    entete contient l'adresse à laquelle commence le mot "TOP". Effectivement la notion de "7" jouera mais ce sera 7 adresses comptées à partir de celle où débute la chaine...

    Citation Envoyé par lcoulon Voir le message
    Je voudrai localiser ce mot dans la chaine1, puis qu'ensuite chaine1 ne garde que se qui se trouve apres l'entete TOP , soit 5543.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ((entete=strstr(chaine1, "TOP")) != NULL)
    	strcpy(chaine1, entete + strlen("TOP"));
    printf("chaine1=%s\n", chaine1);
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  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
    Merci beaucoup, ça fonctionne parfaitement.

    Comme je ne suis pas à l'aise avec les pointeurs, je ne pensai pas que l'on pouvait utiliser strcpy en mettant tout directement en argument l'adresse de l’entête : entete + strlen("TOP")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(chaine1, entete + strlen("TOP"));

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    Comme je ne suis pas à l'aise avec les pointeurs, je ne pensai pas que l'on pouvait utiliser strcpy en mettant tout directement en argument l'adresse de l’entête : entete + strlen("TOP")
    Ben oui. strcpy() demande qu'on lui passe l'adresse de la chaine de destination (adresse située dans la variable "chaine1") puis l'adresse de la chaine source. Or cette adresse se trouve forcément à l'adresse récupérée dans "entete" (adresse où commence le mot "TOP") décalée de 3 caractères (puisque tu veux "ce qui suit" ce mot...). J'aurais pu écrire +3 mais en écrivant + strlen("TOP") ça rend le truc un peu plus modulable (tu remplaces "TOP" par une variable et t'as une fonction plus universelle)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    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
    Mais, strcpy accepte aussi en argument : les noms de chaines de caractères et aussi l'ajout 'en direct' d'un contenu de chaines de caractères.

    Cependant, les arguments sont de type char* ....

  7. #7
    Invité
    Invité(e)
    Par défaut
    Qu'est ce qu'une chaîne de caractère ?

    Scoop : une succession de caractère mis bout à bout.
    Il n'existe pas de type "string" en C, c'est un concept bien trop haut niveau. Chaque chaîne de caractère n'est en fait qu'un tableau de char. Qu'est ce qu'un tableau de char ? Une succession de caractère mis bout à bout. On en revient à "qu'est ce qu'une chaîne de caractère.".

    Ainsi, quand tu dis que
    Mais, strcpy accepte aussi en argument : les noms de chaines de caractères et aussi l'ajout 'en direct' d'un contenu de chaines de caractères.
    Le nom d'une chaîne de caractère est l'adresse du commencement de ce tableau, c'est à dire l'équivalent de &(chaine[0]), donc un char*.
    Quand, selon tes mots, on fait un "ajout direct", il s'agit en fait de la création provisoire d'un tableau de caractère ( via les " "), qui possède une adresse de départ temporaire, donc un char*.

    Si tu souhaites continuer sur la voie du C, je te conseille vivement de bien comprendre les pointeurs, c'est pour ainsi dire un concept central en C.
    De même, la manipulation de chaîne de caractère en C a ses spécificités, et si on ne prends pas le temps de les comprendre, on se plantera souvent.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Petit rajout à l'excellent résumé de archMqx.: une chaine n'est qu'un tableau de char (donc un char*) contenant entre autres le char '\0'. C'est sa présence qui transforme le tableau en chaine. Non pas par une opération "magique" mais simplement parce que toutes les fonctions qui traitent des chaines cherchent toutes ce '\0' et s'en servent comme repère.
    Ainsi char tab[10]={'h', 'e', 'l', 'l', 'o'} et tu n'as qu'un bête tableau mais rajoute tab[5]='\0' et tu as alors le droit d'écrire printf("%s\n", tab). Et c'est exactement ce que fait le compilo quand tu écris char tab[10]="hello". Il copie les caractères un à uns dans le tableau et rajoute lui-même ce '\0' (ce sont les guillemets qui lui servent de repère).

    Tout ça pour dire que tu as tout à fait le droit, si tu veux manipuler plus finement les chaines, de rajouter toi-même (ou d'enlever éventuellement) ce '\0'.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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