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 les positions d'une sous chaine dans une longue chaine


Sujet :

C

  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut trouver les positions d'une sous chaine dans une longue chaine
    bonjour,

    je cherche une fonction ou méthode prédéfinie (je ne sais pas si elle existe ou non) qui retourne les positions d'une sous chaine dans une autre longue?
    par exemple:

    seq: AGCTGTTCGATCGAATCGTGTTCGATTTTCGACTGTGTTCGAACTCGATGTGTTCGACATCAGCTACGCGT
    motf: TGTTCGA
    Il retourne les position suivante: 4, 19, 36, 51.
    Comme on peut trouver une seul position.

    est-ce que ça existe?
    sinon est-ce que vous avez une idée comment faire?
    Merci

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    strstr, je crois

  3. #3
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Salut,

    une boucle avec strstr me paraît pas mal.

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    Citation Envoyé par leternel Voir le message
    strstr, je crois
    strstr retourne la première occurence et non pas une position.

  5. #5
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,
    lis bien la doc … strstr retourne un pointeur dans la chaîne pour indiquer où se trouve la première occurence. si tu recommences dans la même chaîne après la première occurence tu trouves les autres. → strstr + boucle

  6. #6
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    voici le retour de strstr(). d'abord le retour est un char*.
    donc pour mon exemple:
    seq: AGCTGTTCGATCGAATCGTGTTCGATTTTCGACTGTGTTCGAACTCGATGTGTTCGACATCAGCTACGCGT
    motf: TGTTCGA

    elle retourne: TGTTCGATCGAATCGTGTTCGATTTTCGACTGTGTTCGAACTCGATGTGTTCGACATCAGCTACGCGT

    ce n'est pas une position c'est une chaine de caractère.

  7. #7
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    char * est … un pointeur dans la chaîne où on cherche … et avec l'arithmétique des pointeurs on fait ce genre de chose :

    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
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
      char foin[]="il n'est pas difficile de trouver une aiguille ou des aiguilles dans une botte d'aiguille";
      char aiguille[]="aiguille";
     
     
      printf("positions = ");
      char *position=foin;
      do {
        position=strstr(position, aiguille);
        if (position==NULL)
          puts("");
        else  {
          printf("%td ", position-foin);
          position=position+1;
        }
      } while(position!=NULL);
     
      return 0;
    }

  8. #8
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Les noms des param une fois traduits sont bien plus marrants Sinon, pour le curseur de lecture il serait peut-être plus intéressant de le décaler de la longueur de "l'aiguille" (ex. recherche de "TT" dans "ACGTTTATT" renvoie 2 matches sur le premier triple T), à voir selon le besoin.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 7
    Par défaut En prenant en compte la remarque de jopopmk et en utilisant une boucle for, le programme est plus concis
    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
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
      char foin[]="il n'est pas difficile de trouver une aiguille ou des aiguilles dans une botte d'aiguille";
      char aiguille[]="aiguille";
      char *position;
     
      for (position = foin; position = strstr(position, aiguille); position += strlen(aiguille)) // ou dans ce cas précis et un peu plus rapide : position += sizeof(aiguille) - 1
      {
          printf("%u ", position-foin);
      }
     
      return 0;
    }

  10. #10
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Citation Envoyé par jopopmk Voir le message
    Les noms des param une fois traduits sont bien plus marrants Sinon, pour le curseur de lecture il serait peut-être plus intéressant de le décaler de la longueur de "l'aiguille" (ex. recherche de "TT" dans "ACGTTTATT" renvoie 2 matches sur le premier triple T), à voir selon le besoin.
    Citation Envoyé par pp25770 Voir le message
    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
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
      char foin[]="il n'est pas difficile de trouver une aiguille ou des aiguilles dans une botte d'aiguille";
      char aiguille[]="aiguille";
      char *position;
     
      for (position = foin; position = strstr(position, aiguille); position += strlen(aiguille)) // ou dans ce cas précis et un peu plus rapide : position += sizeof(aiguille) - 1
      {
          printf("%u ", position-foin);
      }
     
      return 0;
    }
    Il y a plusieurs problèmes avec ça :
    • Il faut vérifier qu'on ne sort pas de la chaîne …
    • Avec la recherche de 'ana' dans 'les nanas aiment les ananas' il y a 3 occurences :
      'les nanas aiment les ananas'
      'les nanas aiment les ananas'
      'les nanas aiment les ananas'
      La dernière ne sera pas trouvée.

  11. #11
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Citation Envoyé par pp25770 Voir le message
    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
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
      char foin[]="il n'est pas difficile de trouver une aiguille ou des aiguilles dans une botte d'aiguille";
      char aiguille[]="aiguille";
      char *position;
     
      for (position = foin; position = strstr(position, aiguille); position += strlen(aiguille)) // ou dans ce cas précis et un peu plus rapide : position += sizeof(aiguille) - 1
      {
          printf("%u ", position-foin);
      }
     
      return 0;
    }
    Citation Envoyé par picodev Voir le message
    Il y a plusieurs problèmes avec ça :
    • Il faut vérifier qu'on ne sort pas de la chaîne …
    De ce côté-là, je pense que c'est bon.
    Si "strstr(position, aiguille)" renvoie un pointeur nul, alors "position = strstr(position, aiguille)" renverra un pointeur nul qui sera converti en false, ce qui fera sortir de la boucle.
    Si "strstr(position, aiguille)" renvoie un pointeur non nul, alors position sera une chaîne avec au moins "strlen(aiguille)" caractères. Dans le cas limite où il ne resterait que "strlen(aiguille)" caractères, "position += strlen(aiguille)" fera pointer position vers le caractère de fin de chaîne. Alors, le prochain appel à "strstr(position, aiguille)" renverra un pointeur nul et on se retrouvera dans le cas ci-dessus.

    Citation Envoyé par picodev Voir le message
    • Avec la recherche de 'ana' dans 'les nanas aiment les ananas' il y a 3 occurences :
      'les nanas aiment les ananas'
      'les nanas aiment les ananas'
      'les nanas aiment les ananas'
      La dernière ne sera pas trouvée.
    C'est juste, mais je ne sais pas si c'est un problème. Ce qu'a dit mido1951 n'est pas suffisant pour savoir s'il attend que l'algorithme considère qu'il y ait qu'une seule ou bien deux occurrences de "ana" dans "ananas".
    En tout cas, c'est vrai que c'est le genre d'exemple auquel il faut penser quand on spécifie le comportement d'un algorithme qui recherche toutes les occurrences d'une certaine sous-chaîne.
    Avec LibreOffice Writer, quand j'utilise Ctrl+F, il ne trouve qu'une seule occurrence de "ana" dans "ananas".

  12. #12
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Citation Envoyé par Pyramidev Voir le message
    De ce côté-là, je pense que c'est bon.
    Si "strstr(position, aiguille)" renvoie un pointeur nul, alors "position = strstr(position, aiguille)" renverra un pointeur nul qui sera converti en false, ce qui fera sortir de la boucle.
    Si "strstr(position, aiguille)" renvoie un pointeur non nul, alors position sera une chaîne avec au moins "strlen(aiguille)" caractères. Dans le cas limite où il ne resterait que "strlen(aiguille)" caractères, "position += strlen(aiguille)" fera pointer position vers le caractère de fin de chaîne. Alors, le prochain appel à "strstr(position, aiguille)" renverra un pointeur nul et on se retrouvera dans le cas ci-dessus.
    Exact.

    Citation Envoyé par Pyramidev Voir le message
    C'est juste, mais je ne sais pas si c'est un problème. Ce qu'a dit mido1951 n'est pas suffisant pour savoir s'il attend que l'algorithme considère qu'il y ait qu'une seule ou bien deux occurrences de "ana" dans "ananas".
    En tout cas, c'est vrai que c'est le genre d'exemple auquel il faut penser quand on spécifie le comportement d'un algorithme qui recherche toutes les occurrences d'une certaine sous-chaîne.
    Avec LibreOffice Writer, quand j'utilise Ctrl+F, il ne trouve qu'une seule occurrence de "ana" dans "ananas".
    Le sujet me laisse penser que Mido qui va manipuler des chaînes représentant l'ADN va chercher à avoir toutes les occurrences, mais je peux me tromper.

Discussions similaires

  1. Réponses: 7
    Dernier message: 31/08/2012, 20h08
  2. Réponses: 4
    Dernier message: 07/05/2011, 11h50
  3. [RegEx] Remplacement de chaine dans une sous chaine
    Par fpouget dans le forum Langage
    Réponses: 4
    Dernier message: 23/02/2010, 08h49
  4. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  5. recherche d'une chaine dans une sous chaine
    Par claralavraie dans le forum Oracle
    Réponses: 1
    Dernier message: 31/07/2006, 12h00

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