Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction strpbrk()

    31 octobre 2019 à 11:06:40

    Bonjour à tous,

    Toujours sur mes chaines de caractères... je m'intéresse maintenant à la fonction strpbrk() dont le prototype est :

    char *strpbrk(const char *s, const char *accept);

    1. Je décide donc d'écrire le code suivant qui vise à chercher une voyelle dans la string "chaine" :

    int main(int argc, char *argv[])
    {
        const char liste[] = {'a', 'e', 'i', 'o', 'u', 'y'};
        const char chaine[] = "Bbccddoffgghh";
    
        char *element = strpbrk(chaine, liste);
    
        if (element != NULL)
        {
            printf("Caractere %c trouve dans %s\n", *element, chaine);
        }
        else
        {
            printf("Aucun caractere de la liste dans %s...\n", chaine);
        }
    
        return 0;
    }



    Résultat surprenant :

    Caractere B trouve dans Bbccddoffgghh


    2. En essayant différentes choses je rajoute la ligne suivante :

    char *adresse_de_base = chaine;

    Ce qui me donne le code :

    int main(int argc, char *argv[])
    {
        const char liste[] = {'a', 'e', 'i', 'o', 'u', 'y'};
        const char chaine[] = "Bbccddoffgghh";
    
        char *adresse_de_base = chaine;
    
        char *element = strpbrk(chaine, liste);
    
        if (element != NULL)
        {
            printf("Caractere %c trouve dans %s\n", *element, chaine);
        }
        else
        {
            printf("Aucun caractere de la liste dans %s...\n", chaine);
        }
    
        return 0;
    }


    Résultat normal :

    Caractere o trouve dans Bbccddoffgghh

    Alors que je n'ai rien fait d'autre que d'affecter l'adresse du premier élément de "chaine" au pointeur adresse_de_base...

    Question : pourquoi le fait de rajouter cette ligne améliore le fonctionnement de l'ensemble ?

    3. Je comprends que j'ai oublié le caractère '\0' dans ma liste :

    const char liste[] = {'a', 'e', 'i', 'o', 'u', 'y', '\0'};

    et là, plus besoin de la ligne :

    // char *adresse_de_base = chaine;


    Question : pourquoi le fait de rajouter le '\0' a permis de retrouver un fonctionnement normal de strpbrk() ?

    De cette question découle la dernière question, la plus importante :

    Comment pouvais-je savoir avec ce prototype suivant :

    char *strpbrk(const char *s, const char *accept);

    ... qu'il fallait que je déclare une chaine de caractères (avec le '\0' terminal) et non pas un tableau de char simple ?

    Merci beaucoup pour vos réponses @+

    • Partager sur Facebook
    • Partager sur Twitter
      31 octobre 2019 à 11:43:50

      Dans

      char *strpbrk(const char *s, const char *accept);

      accept n'est ni une chaine de caractères ni un tableau de char, c'est simplement un pointeur sur un char

      ...

      • Partager sur Facebook
      • Partager sur Twitter
        31 octobre 2019 à 11:49:44

        frankie31 a écrit:

        Comment pouvais-je savoir avec ce prototype suivant :

        char *strpbrk(const char *s, const char *accept);

        ... qu'il fallait que je déclare une chaine de caractères (avec le '\0' terminal) et non pas un tableau de char simple ?

        la doc : http://manpagesfr.free.fr/man/man3/strpbrk.3.html

        man a écrit:

        DESCRIPTION : La fonction strpbrk() recherche la première occurrence dans la chaîne s de l'un quelconque des caractères de la chaîne accept. 

        • Partager sur Facebook
        • Partager sur Twitter
          31 octobre 2019 à 14:03:39

          rouloude a écrit:

          frankie31 a écrit:

          Comment pouvais-je savoir avec ce prototype suivant :

          char *strpbrk(const char *s, const char *accept);

          ... qu'il fallait que je déclare une chaine de caractères (avec le '\0' terminal) et non pas un tableau de char simple ?

          la doc : http://manpagesfr.free.fr/man/man3/strpbrk.3.html

          man a écrit:

          DESCRIPTION : La fonction strpbrk() recherche la première occurrence dans la chaîne s de l'un quelconque des caractères de la chaîne accept

          Donc avec le prototype seul, je n'avais pas l'information puisque je savais uniquement que le paramètre attendu par la fonction strpbrk() était un pointeur sur char.


          Merci pour vos réponses.

          • Partager sur Facebook
          • Partager sur Twitter
            31 octobre 2019 à 14:09:08

            C'est pour cela qu'il faut lire la doc !
            • Partager sur Facebook
            • Partager sur Twitter

            Fonction strpbrk()

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown