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 :

Chaine de caracteres


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut Chaine de caracteres
    Bonjour,

    J'ai une chaine de caractere (Ch1) de taille n, qui contient des caracteres '1' ou '0' (des bits...).
    Je demande à l'utilisateur de rentrer une chaine de caracteres (Ch2) de taille comprise en 3 et 8 constituée également de '1' et de '0'.
    Je voudrai pouvoir reperer dans la chaine Ch1 combien de fois il y a la chaine Ch2.

    Ex : Ch1 : 001101011100
    Ch2 : 101
    nombre de fois : 2

    Avez vous une idée?
    Merci

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    cherche la fonction strstr() ...

  3. #3
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Je viens de regarder, en effet je pourrai m'en servir pour retourne l'adresse de la première occurrence de la chaine Ch2 dans la chaîne CH1. Mais s'il y a plusieurs occurences et que je veux toutes les avoir?

  4. #4
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Et que pensez vous de la fonction strpbrk ?

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par oeil de lynx Voir le message
    Mais s'il y a plusieurs occurences et que je veux toutes les avoir?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char *p=NULL, *p0=NULL ;
    int     n_occurences = 0 ;
     
    p = chaine ;
    while ( (p0 = strstr ( p, chaine2 )) != NULL )
    {
       n_occurences = n_occurences + 1 ;
       p = p0 + 1 ;
    }

  6. #6
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Merci.
    Je ne comprends pas tres bien ce que represente p dans ton code... Pourrais-tu m'expliquer stp?

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    p represente le debut (flottant) de la chaine dans laquelle on cherche..

    On initialise au debut de la chaine totale..

    Si on trouve une occurence (p0 non NULL), on incremente le compteur et on recommence a chercher a partir du caractere suivant cette occurence (p = p0 +1).

    • Si on mettait p = p0, on resterait toujours au meme endroit.
    • Si on laissait la chaine initiale, on retrouverait toujours la meme occurence.
    • La, on passe le premier caractere, et on cherche le meme motif...

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Si chaine2 est "111" et chaine1 est "111111", on a que 2 occurrences de chaine2 dans chaine1. Il faut donc adapter la mise à jour du pointeur p:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    chaine2_len = strlen(chaine2);
     
    /*...*/
     
    p = p0 + chaine2_len;

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  9. #9
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Merci pour les explications, mais j'ai quelques problemes de comprehension encore !!dslee

    p est donc un char, donc on peut pas l'égaliser à toute une chaine, il faut l'égaliser au 1er element de la chaine?
    Mais quand on fait p = pO+1, on additionne des caracteres ?
    je suis un peu perdue...

  10. #10
    Membre émérite Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut
    p est un pointeur et quand tu fais
    tu ne fais que déplacer ce pointeur attention ! Dans ce cas le pointeur p pointera un caractère après pO

    est-ce plus clair ?

  11. #11
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Ok je comprend mieux
    Mais donc quand on fait p=chaine, chaine c'est la chaine de caracteres entiere, mais cette ligne veut dire qu'on met le pointeur p au debut de la chaine??

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ben oui, c'est juste ça.
    On fait pointer le pointeur p sur le début de la chaîne, ni plus ni moins.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Si chaine2 est "111" et chaine1 est "111111", on a que 2 occurrences de chaine2 dans chaine1. Il faut donc adapter la mise à jour du pointeur p:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    chaine2_len = strlen(chaine2);
     
    /*...*/
     
    p = p0 + chaine2_len;

    Thierry
    ça dépend comment on compte

  14. #14
    Membre émérite Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut
    Citation Envoyé par oeil de lynx Voir le message
    Ok je comprend mieux
    Mais donc quand on fait p=chaine, chaine c'est la chaine de caracteres entiere, mais cette ligne veut dire qu'on met le pointeur p au debut de la chaine??
    oui car une chaine est en fait un pointeur de caractères. Donc quand tu fais p=chaine tu fais pointer p à l'adresse du premier caractère de ta chaine

  15. #15
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Ok, c'est bon j'ai compris, merci.

    Par contre mon programme ne marche pas...
    Je vous met mon code, peut etre que vous verrez l'erreur rapidemment !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char *p=NULL, *p0=NULL ;
    int n_occurences = 0 ;
     
    p = part;
             while ((p0=strstr(p,temp))!=NULL)
             {
              n_occurences = n_occurences + 1 ;
              p = p0 + 1 ;
              }
              printf("\nnb occurences %d\n", n_occurences);
            }
    part est un tableau de caracteres comprenant : 10011111 (donc p doit pointer sur 1 d'abord puis quand il fait le while sur 0,puis 0 puis...)
    temp est aussi un tableau de caracteres comprenant : 111

    Le problème c'est que apparement il ne rentre jamais dans la boucle while.
    Une idée?

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    pourrais-tu indiquer ta définition de tes part et temp, aisni que l'appel ou le code entourant ce morceau de code stp ?

  17. #17
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    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
     
            int size_template;
            int m=9;
            int N=8;
     
            printf("\nEnter the size of the template you want:\n ");
            scanf("%d", &size_template);
     
            unsigned char temp[size_template];
     
            printf("\nEnter the template of the size %d:\n ",size_template);
            for(i=0;i<size_template;i++)
            {
              scanf("%x",&temp[i]);
              }
    et part est defini avant par unsigned char part[8]; et rempli ensuite comme je vous ai dis dans le message precedant.

  18. #18
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Par défaut
    Personne n'a d'idées??

  19. #19
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    ca compile, ca ?????

    Moi je ferais :

    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
     
            int size_template;
            unsigned char *temp = NULL ;
            int m=9;
            int N=8;
     
            printf("\nEnter the size of the template you want:\n ");
            scanf("%d", &size_template);
     
            temp = malloc ( size_template );
            if ( temp == NULL )
             {
                 fprintf ( stderr, "\nErreur d'allocation\n");
                  return ;
             }
    Apres, pour la lecture d'un binaire , je ne sais pas, mais il y a plein d'exemples ici. Mais la, il me semble qu';avec le format x, tu lis un entier.. Or tu veux comparer des char. Donc se serait %c. Mais d'autres plus forts que moi dans ce domaine preciseront..

    Et avant d'appeller ce dont on a parle plus haut, je ferais un print des 2 valeurs (la chaine et la chaine a chercher, afin d everifier qu'elles sont correctes toutes les 2...).

  20. #20
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    ce code est un mix des idées de souviron34, Thierry Chappuis et du PO :
    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
    36
    37
    38
    39
    40
    41
    42
    #include <stdio.h>
    #include <string.h>
     
    #define FORMAT "%1[01]"
     
    size_t count (char const *chaine, char const *template);
     
    int main (void)
    {
       char const *chaine = "111000111000";
       char template[9] = { 0 };
       int ret = 0;
     
       do
       {
          puts ("Entrer la chaine a rechercher :");
          ret = scanf (FORMAT FORMAT FORMAT FORMAT FORMAT FORMAT FORMAT FORMAT, 
                       template, template + 1, template + 2, template + 3, 
                       template + 4, template + 5, template + 6, template + 7);
     
          scanf ("%*[^\n]"), getchar ();/* flush input buffer */
          template[ret] = 0;/* don't forget that C strings end with nul byte */ 
       }
       while (ret < 3);
     
       printf ("nombre d'occurences : %u\n", count (chaine, template));
       return 0;
    }
     
    size_t count (char const *chaine, char const *template)
    {
       char *match = NULL;
       size_t nb_match = 0;
       size_t template_len = strlen (template);
     
       while ((match = strstr (chaine, template)) != NULL)
       {
          nb_match++;
          chaine = match + template_len;
       }
       return nb_match;
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  2. Réponses: 13
    Dernier message: 13/06/2003, 14h13
  3. Pb Update avec chaine de caractere
    Par JuJu° dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/05/2003, 15h58
  4. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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