Compraison de chaine de caractère

Compraison de chaine de caractère - C++ - Programmation

Marsh Posté le 28-04-2003 à 00:23:40    

Salut,
voilà la fct strcmp me dit que la chaine "HOPITAL_BELLEVUE_01" est plus "petite" que "HOPIT._CLAUDINON_20" !
En effet avec :

Code :
  1. test = strcmp ( "HOPITAL_BELLEVUE_01" , "HOPIT._CLAUDINON_20" );


j'ai test = 1
 
Est-ce normal ?
 
Car dans ce cas, ceci n'est pas dans l'ordre alphabétique :


HOPITAL_23
HOPITAL_28
HOPITAL_BELLEVUE_01
HOPITAL_BELLEVUE_04
HOPIT._CLAUDINON_20
HOTEL_DE_VILLE_04

 
n'est-ce pas ?
 
PS : c'est en C
 
Merci @+
Miles

Reply

Marsh Posté le 28-04-2003 à 00:23:40   

Reply

Marsh Posté le 28-04-2003 à 00:39:44    

Ben si test=1, ca veut pas dire que ta premiere chaine est "superieure" a la seconde?
 

Reply

Marsh Posté le 28-04-2003 à 00:41:48    

Bah si, regarde dans une table de caractères ASCII, tu verras qu'il a trié par ordre des caractères ASCII :
 
0 = 30
9 = 39
A = 41
Z = 5a
a = 61
z = 7a
_ = 5f
. = 2e
' ' = 20
 
Donc il a bien trié.
 
A toi de gérer les cas particluliers pour faire passer les espace, _ et ponctuations avant les lettres et les chiffres.

Reply

Marsh Posté le 28-04-2003 à 10:42:41    

voilà ce que j'ai trouvé sur le net sur strcmp :
 

Citation :

unction: int strcmp (const char *s1, const char *s2)
    The strcmp function compares the string s1 against s2, returning a value that has the same sign as the difference between the first differing pair of characters (interpreted as unsigned char objects, then promoted to int).
 
    If the two strings are equal, strcmp returns 0.
 
    A consequence of the ordering used by strcmp is that if s1 is an initial substring of s2, then s1 is considered to be "less than" s2.
 
    strcmp does not take sorting conventions of the language the strings are written in into account. To get that one has to use strcoll.

 
Celà ne veut-il pas dire ques les caractères sont interprétés par des entiers ? (de 0 à 256 je crois)
 
 

Reply

Marsh Posté le 28-04-2003 à 10:50:12    

ben c'est pas nouveau.
 
C/C++ ne font pas la différence entre des nombre et des lettres.
 
les types ne servent qu'à surcharger les opérateurs et indiquer sur combien de bytes travrailler.

Reply

Marsh Posté le 28-04-2003 à 10:50:47    

en C, tu peux très bien faire 'a' - 32
 
Ca te retourne 'A' (ou 65)


Message édité par MagicBuzz le 28-04-2003 à 10:51:20
Reply

Marsh Posté le 28-04-2003 à 11:00:57    

Citation :

voilà la fct strcmp me dit que la chaine "HOPITAL_BELLEVUE_01" est plus "petite" que "HOPIT._CLAUDINON_20" !

 
Bon c'est vrai que celà ne reflete pas la réalité !
je me suis embrouillé les neurones hiers, j'avais besoin de dormir !!
 
Bref, quoiqu'il en soit,  

Code :
  1. test = strcmp ( "HOPITAL_BELLEVUE_01" , "HOPIT._CLAUDINON_20" );


me donne bien test=1, donc (maintenant étant bien reposé), que "HOPITAL_BELLEVUE_01" est superieur à "HOPIT._CLAUDINON_20" !!
 
Le problème est que quand j'ai rentré ces chaines dans mon dico, je ne me suis pas préccupé du classement alpha, puisque notre prof nous a assuré que c'était classé !
Donc, en lisant mon fichier, j'ai mis ces chaines dans mon tableau en correspondance avec la positin de lecture !!
Ainsi, quand je veux savoir en quelle posisiton "HOPITAL_BELLEVUE_01" se trouve dans mon tableau, je devrais avoir comme réponse 151 (c'est là que ce trouve cette chaine !)


149 --> HOPITAL_23
150 --> HOPITAL_28
151 --> HOPITAL_BELLEVUE_01
152 --> HOPITAL_BELLEVUE_04
153 --> HOPIT._CLAUDINON_20
154 --> HOTEL_DE_VILLE_04


(ici, les "xxx --> " ne figure pas dans mon fichier, mais c'est juste pour indiquer leur position respective vu qu'il y a 514 chaines à référencer !)
Pour la recherche du N° d'indice, j'utilise un alog de dichotomie :

Code :
  1. int Recup_Num ( char * mot , DICO * Le_Dico ) {
  2.   int a, b, c, val, test;
  3.   a = 1;
  4.   b = Le_Dico->taille;
  5.   test = 0;
  6.   c = 0;
  7.   while (c == 0){
  8.     val = (b+a)/2;
  9.     test = strcmp (mot,Le_Dico->tab[val]);
  10.     if ( test == 0 ) { /* Ok c'est le mot */
  11.         return val;
  12.     }
  13.     if ( test < 0 ) { /* il faut aller a gauche du tableau */
  14.         b = val;
  15.     }
  16.     else { /* il faut aller a droite du tableau */
  17.         a = val;
  18.     }
  19.     if ( a == b ) { /* le mot ne figure pas dans le dico */
  20.         return -1;
  21.     }
  22.   }
  23. }


ici je passe mot="HOPITAL_BELLEVUE_01"
puis l'alog cherche :
1)
a=1  b=514 --> val=257
  -->test=-1  --> b=val=257
 
2)
a=1  b=257  --> val=129
  -->test=1  --> a=val=129
 
3)
a=129  b=257  --> val=193
  -->test=-1  --> b=val=193
 
4)
a=129  b=193  --> val=161
  -->test=-1  --> b=val=161
 
5)
a=129  b=161  --> val=145
  -->test=1  --> a=val=145
 
Jusque là, tout va bien !!
 
6)
a=145  b=161  --> val=153
  -->test=1  --> a=val=153
Là ca va plus !!!
d'après ces résultats, la chaine mot "HOPITAL_BELLEVUE_01" est plus grande que la chaine d'indice 153 qui est "HOPIT._CLAUDINON_20" !!
Or celà revient à dire que mon prof s'est planté dans le tri des ces chaines !!!
Et donc que "HOPIT._CLAUDINON_20" doit aller avant "HOPITAL_23", non ??
 
Voilà,
merci @+
Miles

Reply

Marsh Posté le 28-04-2003 à 11:03:41    

oui, les ponctuation sont toujours avant les lettres/chiffres

Reply

Marsh Posté le 28-04-2003 à 11:13:16    

é é é é !!
Notre prof est un boulet !!!
Il nous avait pourtant assuré que dans son fichier les noms étaient classé par ordre alphabétique !!
Bon, je lui envoie un mail !!
 
Merci @+
Miles

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed