[Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

[Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)



  1. #1
    invite4f00587c

    Post [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)


    ------

    Salut à tous,

    Me revoilà avec un autre exercice en langage C pour lequel j'ai un petit soucis.

    DA : L'utilisateur entre une chaîne de caractères (code) ainsi qu'un caractère dans la variable (c), le programme affiche la longueur de la chaîne et le nombre d’occurrences du caractère (c) rentré par l'utilisateur. Utilisez 2 fonctions !

    Problème :
    le programme renvoie toujours '6' pour la longueur, quelque soit la chaîne rentrée dans (code) et si j'ajoute la boucle pour compter les occurrences le programme refuse de fonctionner. Blocage au niveau de l'utilisation de strcmp. Comment procéder pour comparer un caractère à ceux d'une chaîne un par un ? J'ai essayer avec une boucle while et un compteur mais sans succès.

    Voici mon code :
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int fonction(char[]);
    void sortie(int,char,int,char[]);
    
    int main(void)
    {
        char c,code[15];
        int length,fois=0;
        printf("\nEntrez le code chaine : ");
        fflush(stdin);
        code[15]=getchar();
        printf("\n\nEntrez un caractere : ");
        fflush(stdin);
        c=getchar();
        printf("\n%c",c);
        fflush(stdin);
        length=fonction(code);
        sortie(length,c,fois,code);
    }
    
    int fonction(char code[])
    {
        int length=0;
        length=strlen(code);
        return length;
    }
    
    void sortie(int length,char c,int fois,char code[])
    {
        // Problème à ce niveau ... Comment compter le nombre d'occurrences du caractère variable c entrée par l'utilisateur ?
        int i=0;
        while(i<15)
        {
            if(strcmp(c,code[i])==0)
            {
                fois++;
                i++;
            }
            else
            {
                i++;
            }
    
        }
        printf("\nLongeur de la chaine : %d",length);
        printf("\nLe caractere %c apparait %d fois dans la chaine.\n",c,fois);
    }

    -----

  2. #2
    invite4492c379

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Hello,

    Tu n'utilises pas correctement certaines fonctions standards de C :

    peux-tu me dire ce que fait la fonction getchar() ?
    connais-tu scanf() ?
    rq : en général les chaînes sont terminées par le caractères '\0'
    quels sont les types des paramètres attendus par la fonction strcmp, quels sont les types des paramètres que tu donnes à la fonction strcmp ?

    ---
    Je suppose que le but de l'exercice est de montrer comment fonctionnent strlen et strchr. Par exemple pour le classique strlen on peut proposer un code comme :

    avec un vision «pointeur»
    Code:
    int monStrLen(char* str)
    {
      int len;
    
      len=0;
      if (str!=NULL) {
        while (*str!=0) {
          str++;
          len++;
      }
      return len;
    }
    avec une vision «pointeur» un peu plus geek
    Code:
    int geekStrLen(char* str)
    {
      char* p=str;
      if (!str) return 0;
      while (*(p++));
      return p-str -1;
    }
    avec un vision «tableau»
    Code:
    int StrLen(char* str)
    {
      int i;
      if (str==NULL) return 0;
      i=0;
      while (str[i]!='\0')
        i++;
      return i;
    }

    Ce dernier code peut-être facilement adapté pour compter le nombre d'occurence d'un caractère dans un chaîne.

  3. #3
    invite0bef94e7

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Le problème vient de ta fonction :
    if(strcmp(c,code[i])==0)
    Ici tu compares un caractère à une chaine de caractère (commençant à l'index i).
    Vu que "c" est un simple caractère, tu risques en plus de faire un accès incorrect à la mémoire dès le deuxième caractère de "c" (ou du moins l'accès à son adresse)

  4. #4
    Jack
    Modérateur

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Citation Envoyé par magnum0001 Voir le message
    Le problème vient de ta fonction :
    if(strcmp(c,code[i])==0)
    Ici tu compares un caractère à une chaine de caractère (commençant à l'index i).
    Vu que "c" est un simple caractère, tu risques en plus de faire un accès incorrect à la mémoire dès le deuxième caractère de "c" (ou du moins l'accès à son adresse)
    C'est même pire que çà, car code[i] est un caractère également.

    En fait, strcmp attend 2 adresses de chaine et ce sont 2 caractères qui sont passés. ces caractères sont donc pris comme des adresses, ce qui entraine un grand n'importe quoi à l'exécution.

    A+

  5. A voir en vidéo sur Futura
  6. #5
    invite4492c379

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Citation Envoyé par Jack Voir le message
    C'est même pire que çà, car code[i] est un caractère également.

    En fait, strcmp attend 2 adresses de chaine et ce sont 2 caractères qui sont passés. ces caractères sont donc pris comme des adresses, ce qui entraine un grand n'importe quoi à l'exécution.

    A+
    Sans compter les avertissements émis lors de la compil ...

  7. #6
    invite2d7144a7

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Bonjour,
    Citation Envoyé par photon57 Voir le message
    rq : en général les chaînes sont terminées par le caractères '\0'
    Pas "en général", elles doivent ! (sinon c'est un simple tableau de caractères, pas une chaîne de caractères, et les fonctions dédiées aux chaînes ne fonctionneront pas).

  8. #7
    invite4492c379

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Oui, les chaînes sont à zero terminal si on désire utiliser les fonctions dédiées de la libc. Sinon rien n'interdit une autre implémentation (ce qui est nécessaire parfois suivant les bibliothèques externes utilisées ou les plateformes sur lesquelles le code va s'exécuter). D'où mon en général ...

  9. #8
    invite2d7144a7

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Bonjour,

    Désolé, mais alors tu sors du cadre des chaînes de caractères du C, et ta remarque d'origine reste fausse.
    Le 0 terminal des chaînes en C ne dépend absolument pas de la plateforme ou autres détails, c'est la règle, ce n'est pas moi qui l'ai établie (je trouve ça complètement absurde ), mais elle est là.

  10. #9
    invite4492c379

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Citation Envoyé par whoami Voir le message
    Bonjour,

    Désolé, mais alors tu sors du cadre des chaînes de caractères du C, et ta remarque d'origine reste fausse.
    Le 0 terminal des chaînes en C ne dépend absolument pas de la plateforme ou autres détails, c'est la règle, ce n'est pas moi qui l'ai établie (je trouve ça complètement absurde ), mais elle est là.
    Malheureusement si ... il y a plusieurs cas de figures, par exemple :

    * si tu veux faire interagir du code pascal et du C, tu peux tout aussi bien choisir le 0 terminal que la taille dans le premier octet
    * si tu utilises unicode tu es obligé de faire autrement que d'utiliser les mécanismes classiques de C


    mais là on sort allègrement du cadre de l'exercice.

  11. #10
    invite4f00587c

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Citation Envoyé par photon57 Voir le message
    peux-tu me dire ce que fait la fonction getchar() ?
    connais-tu scanf() ?
    Je voulais utiliser gets() et non getchar(), autant pour moi.

  12. #11
    invite2d7144a7

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Bonjour,
    Citation Envoyé par photon57 Voir le message
    Malheureusement si ... il y a plusieurs cas de figures, par exemple :

    * si tu veux faire interagir du code pascal et du C, tu peux tout aussi bien choisir le 0 terminal que la taille dans le premier octet
    * si tu utilises unicode tu es obligé de faire autrement que d'utiliser les mécanismes classiques de C


    mais là on sort allègrement du cadre de l'exercice.
    Comme tu le dis, ici on parle des chaînes du C. Donc ...

  13. #12
    invite4492c379

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    C n'a pas de type chaînes de caractères, seule la libc propose des fonctions pour manipuler des chaînes de caractères limitées aux caractères ASCII sous forme de tableau de char à 0 terminal, d'autres bibliothèques proposent des fonctions pour manipuler des chaînes de caractères avec d'autres conventions et d'autres encodages (ICU par exemple).

  14. #13
    invite2d7144a7

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Bonjour,

    On peut dire que la libc fait partie du langage. Qui ne s'en sert pas ?

    D'ailleurs, le 0 terminal vient de la première description du langage par K&R (et donc de la naissance du C), à travers tous les exemples qu'il utilise pour montrer comment faire.

    Et je le répète, en ce qui me concerne, c'est absurde. Mais il faut faire avec, et pour les débutants, on leur demande dans les exercices de le faire ainsi. Ce qui est tout aussi dommage, mais il faut y passer, sinon la plupart du temps, ils ne comprendraient pas le quart des programmes qu'ils n'auraient pas écrits.

    Et toujours en ce qui me concerne, et là, c'est l'enseignant qui s'exprime, je refuse de plus en plus souvent de faire des cours en C, préférant les orienter directement vers le C++, par où ils devront passer un jour ou l'autre, le pur C étant de plus en plus réservé à l'embarqué (pas uniquement, mais on voit aussi de plus en plus de programmeur "pur C" utiliser des astuces pour essayer d'approcher la programmation objet, cherchant donc à imiter C++, et le plus simple est sans le moindre doute d'effectivement utiliser C++).

  15. #14
    invite4492c379

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Hello,

    et combien de fois me suis-je trouvé face à des stagiaires qui dans leurs cerveaux pensent manipuler un type C quand ils me parlent de chaînes de caractères et qu'ils m'expliquent que c'est impossible de manipuler de l'UTF8 ou de l'UCS4 en C ...

  16. #15
    invite2d7144a7

    Re : [Exercice]Rechercher le nombre d'occurrences d'un caractère dans une chaîne(C)

    Bonjour,

    Ben oui ...

    p****ns de débutants !

    et d'enseignants qui oublient si souvent d'expliquer clairement ce qu'il en est (et ce n'est pas spécifique au C).

Discussions similaires

  1. chaine de caractère
    Par invite9f95f6e7 dans le forum Programmation et langages, Algorithmique
    Réponses: 27
    Dernier message: 01/01/2012, 18h38
  2. chaîne de caractère
    Par invite9f95f6e7 dans le forum Programmation et langages, Algorithmique
    Réponses: 15
    Dernier message: 01/01/2012, 16h06
  3. chercher une chaine de caractère dans un texte en Langage C
    Par invitee5fedd72 dans le forum Programmation et langages, Algorithmique
    Réponses: 17
    Dernier message: 10/12/2010, 01h01
  4. Fonction retournant une chaine de caractère
    Par inviteddae56c8 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 05/09/2007, 22h28
  5. [C++] Exploiter une chaîne de caractère lue au clavier
    Par invite9c9b9968 dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 25/06/2006, 00h47