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 :

recherche d'une chaîne de caractères dans une autre.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    étudiant ingénieur
    Inscrit en
    Juin 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : étudiant ingénieur

    Informations forums :
    Inscription : Juin 2010
    Messages : 37
    Par défaut recherche d'une chaîne de caractères dans une autre.
    Salut à tous,
    Voici mon problème, j'ai un fichier binaire, constitué d'une succession d'ensembles, en quantité inconnue, de taille variable mais commencent tous par le même entête. J'aimerais récupérer chacun d'entre eux.

    Se que j'ai essayer de faire:
    Lire le fichier et stocker son contenus dans un buffer et l'entête dans un autre buffer. Je pensais comparer les deux buffers mais je ne sais pas comment procéder

  2. #2
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Pour trouver une chaine dans une chaine utilise la fonction strstr().

  3. #3
    Membre averti
    Profil pro
    étudiant ingénieur
    Inscrit en
    Juin 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : étudiant ingénieur

    Informations forums :
    Inscription : Juin 2010
    Messages : 37
    Par défaut
    J'ai penser à cette fonction, mais vus quelle retourne le premier cas compatible. Je ne vois pas comment l'utiliser dans le cas ou la string rechercher figure plusieurs fois dans la string principale.

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Tu fais un décalage à chaque check.

    En gros:

    Imaginons que tu cherche la chaine "bla" dans la chaine "bladibladibla"

    Tu fais appel une première fois à cette fonction en fournissant les 2 chaines en paramètres.

    La fonction te renverra un pointeur vers le premier élément.

    Ensuite tu verifie si ce pointeur est en fin de chaine. (Là, en l'occurence, non).

    Si non tu rappelle la fonction, mais au lieu de lui filer la chaine "bladibladibla" complète, tu lui file uniquement "dibladibla" (un truc du genre: strstr(str + 3, str2)).

    et ainsi de suite jusqu'à arriver à la fin de la chaine.

  5. #5
    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
    Pour compléter le réponse précédente :

    strstr() retourne NULL si la sosu-chaine n'est pas trouvée ou si elle est trouvée l'adresse du début de la sous-chaine dans la chaine.
    Ceci étant, il faut savoir si on considère le cas où une deuxième sous-chaine peut débuter à l'intérieur de la première sous-chaine.

    Par exemple chaine : "xxxabababxxx" , sous-chaine : "aba"
    Une premiere sous-chaine est trouvée en "xxxaba..." Peut-on considérer que la deuxième est en "xxxababa", donc inclus le dernier caractère de la première sous-chaine ou qu'il n'y a pas de deuxième sous-chaine à partir de la fin de la première ?

    - Dans le premier cas,
      1- initialiser le pointeur p à l'adresse du début de la chaine
      2- rechercher la sous-chaine à partir de p
      - si on en trouve une débutant en p, faire p = p+1 et recommencer en 2.
      - sinon, il n'y en a plus.
    - Dans le second cas, au lieu de chercher les sous chaines à partir de p+1 on recherchera à partir p+L où L est la longueur de la sous-chaine

  6. #6
    Membre averti
    Profil pro
    étudiant ingénieur
    Inscrit en
    Juin 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : étudiant ingénieur

    Informations forums :
    Inscription : Juin 2010
    Messages : 37
    Par défaut
    J'ai essayer d'implémenté l'idée de 6-MarViN, et sa marche, se bout de code affiche la position ou se trouve de la chaine "bla" soit en 0, en 5 et en 10. Toute fois, je fait plusieurs fois le test ch!=NULL, est ce qu'il n'y aurais pas moyen d'améliorer ?

    Le bout de 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
    char str[] ="bladibladibla";
    	  char * ch;
    	  ch = strstr (str,"bla");
    	  int cmpt=0,ret=-1,temp=0;
    	  while(ch != NULL || ch != '\0')
    	  {
    		  ch = strstr (str + cmpt,"bla");
    		  if(ch != NULL)
    		  {
    			  temp = ch - str;
    			  if(temp != ret)
    			  {
    				  ret=temp;
    				  printf("%d\n",ret);
    			  }
    		  }
    		  cmpt++;
    	  }
    Edit : diogene, le problème que tu expose, n'apparais pas dans les fichiers sur lesquels je travaille.
    Edit2 : fregolo52, les fichiers avec lesquels je travaille sont 100% binaire, j'ai joins un de ces fichiers si sa peut aider.

    Edit3 :
    Dommage que la taille des champs ne soit pas renseigner pour chaque champs, cela aurait été beaucoup plus simple et plus rapide.
    Dans l'entête y a un octet qui permet de calculer la taille de l'entête (71 octets dans mon fichier). Il y a aussi deux octets qui permettent de connaitre la taille des élément qui suivent l'entête (777 octets dans mon fichier)

    Le problème que j'ai c'est qu'il arrive d'avoir les élément qui suivent l'entête d'une longueur inférieurs à celle indiqué par l'entête.
    Fichiers attachés Fichiers attachés

  7. #7
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Citation Envoyé par silenteagle Voir le message
    Le problème que j'ai c'est qu'il arrive d'avoir les élément qui suivent l'entête d'une longueur inférieurs à celle indiqué par l'entête.
    Tu es devin ? Non !! Donc comment peux-tu gérer ce cas ? Dur dur !! A moins que dans l'en-tête il y aie une suite d'octet identique dans chaque en-tête.
    En gros tu ne peux pas faire confiance aux données du fichier !!

  8. #8
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Citation Envoyé par silenteagle Voir le message
    Voici mon problème, j'ai un fichier binaire, constitué d'une succession d'ensembles, en quantité inconnue, de taille variable mais commencent tous par le même entête. J'aimerais récupérer chacun d'entre eux.
    Ce qui me chagrine dans ton énoncé c'est le mot binaire.

    Ton fichier est 100% chaine de caractères ? ou est qu'on peut se retrouver avec des octets non imprimable style 0x01 qui va faire pèter strstr (il me semble).

  9. #9
    Membre émérite
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 511
    Par défaut
    Bonjour

    Je suis d'accord avec fregolo52. Le mot binaire me fait dire que traiter ce fichier avec des fonctions utilisables pour des String me parait très dangereux.

    Pour pour, il faut le traiter d'une manière binaire.
    - On cherche dans le buffer toutes les occurrences d'une suite d'octets et on mémorise leurs positions.
    - Puis pour chaque position (sauf la dernière), on extrait le code binaire entre cette position et la position suivante.

    Je ne connais pas d'autre moyens plus simples, mais c'est pas parce que je n'en connais , qu'il n'existe pas d'autre.

    Dommage que la taille des champs ne soit pas renseigner pour chaque champs, cela aurait été beaucoup plus simple et plus rapide.
    Page sur Developpez : http://pbriand.developpez.com

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/07/2014, 02h31
  2. [Débutant] Recherche d'une chaîne de caractères dans une autre
    Par alexabcinformatique dans le forum VB.NET
    Réponses: 4
    Dernier message: 27/03/2012, 13h25
  3. Réponses: 3
    Dernier message: 13/05/2008, 13h11
  4. Rechercher une chaîne de caractère dans une série de fichier
    Par Edoxituz dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/02/2006, 12h51
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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