Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre du Club
    Inscrit en
    février 2007
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : février 2007
    Messages : 325
    Points : 60
    Points
    60

    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 :
    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
    Responsable FAQ C++
    Avatar de Winjerome
    Homme Profil pro Jérôme
    Inscrit en
    septembre 2009
    Messages
    7 543
    Détails du profil
    Informations personnelles :
    Nom : Homme Jérôme
    Âge : 27
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : septembre 2009
    Messages : 7 543
    Points : 25 431
    Points
    25 431

    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
    8 416
    Détails du profil
    Informations personnelles :
    Âge : 34
    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 : 8 416
    Points : 21 241
    Points
    21 241

    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
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 316
    Points : 12 319
    Points
    12 319

    Par défaut

    Bonjour,
    Tu ne peux pas comparer deux chaînes de cette façon-ci :

    Code :
    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 du Club
    Inscrit en
    février 2007
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : février 2007
    Messages : 325
    Points : 60
    Points
    60

    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 :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •