1. #1
    Membre régulier
    Profil pro
    Inscrit en
    février 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 367
    Points : 110
    Points
    110

    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
    Expert éminent sénior

    Avatar de Winjerome
    Homme Profil pro
    Inscrit en
    septembre 2009
    Messages
    8 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : septembre 2009
    Messages : 8 807
    Points : 32 461
    Points
    32 461

    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
    Profil pro
    R&D en systemes informatiques bas niveau Unix/Linux
    Inscrit en
    mai 2004
    Messages
    9 126
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : R&D en systemes informatiques bas niveau Unix/Linux

    Informations forums :
    Inscription : mai 2004
    Messages : 9 126
    Points : 25 762
    Points
    25 762

    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 ?
    Modérateur "C", "Informatique Générale & Hardware" et "Unix"
    Les règles du forum

  4. #4
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    6 538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 6 538
    Points : 20 618
    Points
    20 618

    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 régulier
    Profil pro
    Inscrit en
    février 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 367
    Points : 110
    Points
    110

    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