Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme inversion chaine de caractere en C

    22 septembre 2017 à 15:39:42

    Bonjours, alors voila mon problème je veut créer un programme qui dit si le mot entrer par l'utilisateur est un palindrome ou non ( ce lit de la même façon dans les deux sens ) pour ce faire comme vous aller le voir dans le code que je vais ajouter j'utilise une deuxieme chaine mais le probleme c'est que la deuxième chaîne reste vide.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int verificationPalindrome(char mot[]);
    
    int main()
    {
        int palindrome=0;
        char mot[100]="";
    
        printf("Entrer un mot pour savoir si c'est un palindrome:\n");
        scanf("%s", mot);
    
        palindrome=verificationPalindrome(mot);
    
        if(palindrome)
        {
            printf("%s est un palindrome\n\n", mot);
        }
        else
        {
            printf("%s n est pas un palindrome\n\n", mot);
        }
    
        return 0;
    }
    
    int verificationPalindrome(char mot[])
    {
        int i=0, j=0, longeurMot=0, palindrome=0;
        char motInverser[100]="";
    
        j=strlen(mot);
        longeurMot=strlen(mot);
    
        for(i=0; i<longeurMot; i++)
        {
            motInverser[i]=mot[j];
            j--;
        }
    
        longeurMot++;
    
        motInverser[longeurMot]='\0';
    
        printf("motInverser: %s\n\n", motInverser);// test pour voir si le mot inverser a bien ete créer
    
        if (strcmp(mot, motInverser)==0)
        {
            palindrome=1;
        }
        else
        {
            palindrome=0;
        }
    
        return palindrome;
    }
    



    -
    Edité par DonovanMaurice 22 septembre 2017 à 15:50:24

    • Partager sur Facebook
    • Partager sur Twitter
      22 septembre 2017 à 16:42:14

      Une fonction pour inverser un mot :

      void inverseMot(char *dest, const char *src)
      {
          int i=strlen(src);
          for(int j=0; j<i; j++) dest[i-j-1]=src[j];
      }



      • Partager sur Facebook
      • Partager sur Twitter
        23 septembre 2017 à 2:35:12

        Merci mais j'aurait preferer une correction de mon code pour voir mon erreur.
        • Partager sur Facebook
        • Partager sur Twitter
          23 septembre 2017 à 9:29:45

          Salut,

          Ligne 39 :

          Au premier tour de la boucle for, tu copies le caractère de fin de chaine NUL '\0' du tableau mot en 1ère position du tableau motInverser !

          Tu piges ?

          ...

          • Partager sur Facebook
          • Partager sur Twitter
            23 septembre 2017 à 9:30:42

            essaie j=strlen(mot)-1;
            • Partager sur Facebook
            • Partager sur Twitter

            Le crayon la gomme et le papier sont les meilleurs outils du programmeur !

              23 septembre 2017 à 23:01:09

              joel76 a écrit:

              essaie j=strlen(mot)-1;

              Non, strlen retourne un size_t, qui est un type non signé. Dans le cas d'une chaine vide, j vaudrait SIZE_MAX (une solution sur ce sujet).

              -
              Edité par Mad scientist 23 septembre 2017 à 23:14:50

              • Partager sur Facebook
              • Partager sur Twitter
              Un vrai cours de: (C | C++ | Haskell débutant | Haskell intermédiaire | Rust).
              Anonyme
                24 septembre 2017 à 14:08:50

                DonovanMaurice a écrit:

                Merci mais j'aurait preferer une correction de mon code pour voir mon erreur.


                L'erreur, c'est la manière de résoudre, tu te compliques trop la vie, prenons un exemple avec le mot rotor.

                • Je teste la 1ère lettre et la dernière -> ok
                • Je teste la 2ème lettre et l'avant dernière -> ok
                • Quelque soit la lettre au centre, ça restera un palindrome.

                Prenons maintenant un mot n'étant pas un palindrome, comme le mot test.

                • Je teste la 1ère lettre et la dernière -> ok
                • Je teste la 2ème lettre et l'avant dernière -> pas ok

                C'est un jeu d'indices dont la limite s'arrête au centre du mot, peu importe sa longueur.

                Avec 4 variables on règle ce problème et cela sans chercher à inverser le mot à tester.

                • La variable résultante indiquant si c'est oui ou non un palindrome
                • La variable indiquant la longueur du mot à analyser
                • La variable indiquant la moitié de cette longueur
                • La variable d'incrémentation

                ----------------------------------------------------------------

                Il faudra aussi veiller à choisir des noms de fonction adaptés au problème, car c'est censé être utilisé comme test avec une condition.

                Plus rigoureusement,

                • Le test palindrome peut-il être négatif ?
                • L'indice i et j peuvent-ils être négatifs ?

                Que se passe-t-il si mot vaut "" ? Est-ce un palindrome ?

                Bonne continuation...

                • Partager sur Facebook
                • Partager sur Twitter
                  24 septembre 2017 à 14:44:30

                  merci a tous pour vos reponse :D (strlen(mot)-1) a fonctionner, je pensait que strlen ne comptait pas la '\0' ^^ .
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    24 septembre 2017 à 15:34:26

                    DonovanMaurice a écrit:

                    je pensait que strlen ne comptait pas la '\0'

                    C'est pourtant le cas !

                    -
                    Edité par Anonyme 24 septembre 2017 à 15:35:26

                    • Partager sur Facebook
                    • Partager sur Twitter

                    probleme inversion chaine de caractere en C

                    × 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