p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre régulier
    Inscrit en
    février 2007
    Messages
    341
    Détails du profil
    Informations forums :
    Inscription : février 2007
    Messages : 341
    Points : 70
    Points
    70

    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 Confirmé Sénior
    Avatar de Winjerome
    Homme Profil pro
    Inscrit en
    septembre 2009
    Messages
    8 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : septembre 2009
    Messages : 8 325
    Points : 30 478
    Points
    30 478

    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 003
    Détails du profil
    Informations personnelles :
    Âge : 35
    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 003
    Points : 24 951
    Points
    24 951

    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
    5 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    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 940
    Points : 16 545
    Points
    16 545

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

    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