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 :

Comparaison de chaines problématique avec la lettre p ?


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 755
    Points : 208
    Points
    208
    Par défaut Comparaison de chaines problématique avec la lettre p ?
    bonjour,
    Je viens sur le forum pour demander si quelqu'un a rencontré le même problème que moi en programmant sous MinGW sous Windows en C.
    Je viens d'écrire ce petit programme de tri de tableau de pointeurs qui fonctionne (tri le tableau dans un ordre croissant) :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    main()
    {
     /* Déclarations */
     char INTRO[50]; /* chaîne pour l'introduction des données   */
     char *MOT[4]; /* Tableau des pointeurs sur les 10 chaînes */
     char *PTEMP; /* pointeurs d'aide pour l'échange des pointeurs */
      int I,J;     /* indices courants */
     /* Saisie des données et allocation dynamique de mémoire */
     puts("Introduire 4 phrases terminées chaque fois"
          " par un retour à la ligne :");
     for (I=0; I<4; I++)
         {
          /* Lecture d'une phrase */
          printf("Phrase %d : ",I);
          gets(INTRO);
          /* Réservation de la mémoire */
          MOT[I] = malloc(strlen(INTRO)+1);
          /* S'il y a assez de mémoire, ... */
          if (MOT[I])
               /* copier la phrase à l'adresse */
               /* fournie par malloc,          */
               strcpy(MOT[I], INTRO);
          else
              {
               /* sinon afficher un message d'erreur */
               printf("\aPas assez de mémoire \n");
               /* et quitter le programme. */
               exit(-1);
              }
          }
     /* Afficher le tableau donné */
     puts("Contenu du tableau donné :");
     for (I=0; I<4; I++)   puts(MOT[I]);
     
     /* Effacer les 10 mots un à un,
       en suivant l'ordre lexicographique */
     J=0; 
     /*PAIDE=MOT[I];*/
     while (J<4)
       {
       printf("44 %d %d\n",I,J);
       for (I=J;I<4;I++)
         {
          printf("47 %s %s %d %d\n",MOT[I],MOT[J],I,J);   
          if (*MOT[I]<*MOT[J]) 
          {
     
            PTEMP=MOT[J];
            MOT[J]=MOT[I];   
            MOT[I]=PTEMP;     
            printf("54 %s %s %d %d\n",MOT[I],MOT[J],I,J);
        /*    printf("51 %s %s\n",MOT[I],PAIDE);      */
          } else
          {
            printf("58 non %d %d<\n",I,J);
          }    
         } 
       J++;  
       }   
      /* Afficher le tableau résultat */
     puts("Contenu du tableau résultat :");
     for (I=0; I<4; I++)   puts(MOT[I]);
     return 0;
    }
    Le problème que j'ai rencontré en l'utilisant c'est quand je rentre les mots "pilote" et "passager" il ne veut pas me les trier autrement dit il ne "voit " pas que "pilote " est supérieur à "passager" ...
    J'ai testé avec d'autres mots j'ai pas le problème apparement seulement avec la lettre "p".
    Trés curieux !!!
    Si quelqu'un a l'explication merçi de me tenir au courant
    A+

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Quelques remarques :

    Ton problème principal vient de la ligne :
    Tu ne fais que comparer la première lettre des mots. Il te faut utiliser strcmp().

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 149
    Points : 28 116
    Points
    28 116
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    J'ai testé avec d'autres mots j'ai pas le problème apparement seulement avec la lettre "p".
    Trés curieux !!!
    Que te donne "avion" et "aeronautique" ? As-tu fait des tests avec d'autres mots commencant par la meme lettre ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Bonjour,
    Tu ne peux pas comparer deux chaînes de cette façon-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          if (*MOT[I]<*MOT[J]) 
          {
    Quand tu écris cela, tu déréférences chaque pointeur et en réalité, tu compares entre eux les premiers caractères de chaque chaîne, quels que soient les suivants. À la place, il te faut utiliser la fonction strcmp().

    Comme le subodore Gangsoleil, soit tes autres mots ont tous une initiale différente, soit ils sont déjà triés lorsque tu les saisis.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 755
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,
    Tu ne peux pas comparer deux chaînes de cette façon-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          if (*MOT[I]<*MOT[J]) 
          {
    Quand tu écris cela, tu déréférences chaque pointeur et en réalité, tu compares entre eux les premiers caractères de chaque chaîne, quelque soient les suivants. À la place, il te faut utiliser la fonction strcmp().

    Comme le subodore Gangsoleil, soit tes autres mots ont tous une initiale différente, soit ils sont déjà triés lorsque tu les saisis.
    ****************************************************
    MErçi à tous pour vos réponses effectivement ça marche avec strcmp.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] NB.SI.ENS avec comparaison de chaine
    Par gaumez dans le forum Excel
    Réponses: 5
    Dernier message: 22/05/2013, 11h02
  2. comparaison de chaines avec caractères spéciaux
    Par battl14 dans le forum Développement
    Réponses: 0
    Dernier message: 07/04/2009, 18h35
  3. Problème avec comparaison de chaines de caractères
    Par nemesis00 dans le forum MATLAB
    Réponses: 4
    Dernier message: 01/01/2008, 18h56
  4. comparaison de chaine avec caractères spéciaux
    Par loulag07 dans le forum Langage
    Réponses: 1
    Dernier message: 22/11/2007, 10h04
  5. [VBA/EXCEL]comparaison de chaine de caractere avec ou sans espace
    Par rodrigue62 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/07/2007, 10h48

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