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 mots


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Comparaison de mots
    Bonjour,

    j'ai écrit un programme permettant de comparer des mots suivants des fonctions de comparaison : ordre lexicographique, ordre lexicographique inverse et voyelles-consonnes.
    Cette dernière fonction prend une chaine de caractere en parametre et met dans une autre chaine les voyelles au début puis utilise l'ordre lexicographique
    En testant ma fonction qui réorganise une chaine de caractere, j'ai bien ce qu'il faut mais lorsque je teste la fonction voyellesConsonnes, la valeur de retour ne correspond pas à ce qu'il faut.

    Voici mon code :
    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
    69
    70
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int cmpLexico(const char *s1, const char *s2)
    {
      while(*s1++ == *s2++ && *s1!='\0')
        ;
      if(*s1 == '\0')
        return 0;
      else if(*s1 < *s2)
        return -1;
      else return 1;
    }
     
    int cmpInvLexico(const char *s1, const char *s2)
    {
      return cmpLexico(s2, s1);
    }
     
    int voyelle(char c){
      if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'y')
        return 1;
      return 0;
    }
     
    char *modif(const char *s){
      int l = strlen(s);
      char *tmp = malloc(strlen(s));
      if(tmp == NULL)
        return NULL;
      int nbElem = 0;
      int i;
      for(i=0; i<l; i++)
        if(voyelle(s[i]))
          tmp[nbElem++] = s[i];
      for(i=0; i<l; i++)
        if(!voyelle(s[i]))
          tmp[nbElem++] = s[i];
      tmp[nbElem] = '\0';
      return tmp;
    }
     
    int voyellesConsonnes(const char *s1, const char *s2)
    {
      char *m1 = modif(s1);
      char *m2 = modif(s2);
     
      return cmpLexico(m1,m2);
    }
     
    int main(int argc, char *argv[])
    {
      if(argc != 3)
        {
          fprintf(stderr, "%s mot1 mot2\n", argv[0]);
          exit(EXIT_FAILURE);
        }
     
      printf("Ordre lexico : %d\n", cmpLexico(argv[1], argv[2]));
     
      printf("Ordre lexico inverse : %d\n", cmpInvLexico(argv[1], argv[2]));
     
      /*Test pour verifier que les modifs ont eu lieues*/
      char *m1 = modif(argv[1]);
      char *m2 = modif(argv[2]);
      printf("%s %s\n",m1,m2);
      printf("Ordre voyelles-consonnes : %d\n",voyellesConsonnes(argv[1], argv[2]));
      return EXIT_SUCCESS;
    }
    Ce que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ ./test un deux
    Ordre lexico : 1
    Ordre lexico inverse : -1
    un eudx
    Ordre voyelles-consonnes : -1

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int cmpLexico(const char *s1, const char *s2)
    {
      while(*s1++ == *s2++ && *s1!='\0')
        ;
      if(*s1 == '\0')
        return 0;
      else if(*s1 < *s2)
        return -1;
      else return 1;
    }
    Cette fonction n'est pas portable. Les lettres de l'alphabet ne sont pas forcément consécutif dans le codage des caractères.

    Tu devrais utiliser strcmp à la place et tu n'aurais pas eu de problèmes...

    Par contre, pour résoudre ton problème et te montrer ton erreur, elle se trouve comme trop souvent dans un abus et une mauvaise maîtrise du post-incrémenteur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      while(*s1++ == *s2++ && *s1!='\0')
        ;
    aurait dû être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      while(*s1 == *s2 && *s1!='\0')
        {
        s1++ ;
        s2++;
        }
    Jc

  3. #3
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Je dirais même plus

    strncmp

    Car dans le cas (je ne sais pas ici) ou tu souhaites comparer un début de chaîne entre s1 et s2

    ex Algo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    s1 = "toto12345"
    s2 = "toto1"
    avec strncmp tu peux avoir s1 == s2 avec strcmp s1 tjs != s2
    Et strncmp est un peu plus sur..., je dis un peu, car cela dépend comment on l'utilise, et on peut faire autant de bêtise qu'avec strcmp....

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    J'ai une question à propos de l'utilisation des fonctions en parametres.
    Par exemple, si j'ai une fonction :
    int fonction(FILE *f, int (*cmp)(const void *o1, const void *o2))
    est ce que dans le corps de la fonction, pour appeler la fonction de comparaison cmp, il me suffit d'écrire par exemple tri(cmp)

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ben non, pour appeler cmp, tu dois écrire par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int fonction(FILE *f, int (*cmp)(const void *o1, const void *o2))
    {
    long l1 = 42;
    long l2 = 43;
     
    int res = cmp(&l1, &l2);
    //...
    }
    Et si tu as une fonction int compare(const void *o1, const void *o2), tu peux appeler la fonction principale ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nResultat = fonction(f, compare);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [SQL] Comparaison de mots de passe
    Par Simpom dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/01/2008, 17h42
  2. [MySQL] Comparaison de mots de passe PHP-MySQL
    Par jaymzwise dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 30/07/2007, 14h31
  3. [Delphi] Lecture et comparaison de mots de passe
    Par Jayceblaster dans le forum Langage
    Réponses: 6
    Dernier message: 22/04/2006, 12h21
  4. Réponses: 4
    Dernier message: 16/12/2005, 17h43
  5. Encodage et comparaison de mot de passe
    Par SuperCed dans le forum Sécurité
    Réponses: 4
    Dernier message: 27/05/2005, 12h01

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