Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2157 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Compraison de chaine de caractère

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Compraison de chaine de caractère

n°373649
Miles--Teg
Posté le 28-04-2003 à 00:23:40  profilanswer
 

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

mood
Publicité
Posté le 28-04-2003 à 00:23:40  profilanswer
 

n°373655
Angel_Doog​las
Le dernier des humains
Posté le 28-04-2003 à 00:39:44  profilanswer
 

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

n°373656
MagicBuzz
Posté le 28-04-2003 à 00:41:48  profilanswer
 

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.

n°373934
Miles--Teg
Posté le 28-04-2003 à 10:42:41  profilanswer
 

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)
 
 

n°373951
MagicBuzz
Posté le 28-04-2003 à 10:50:12  profilanswer
 

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.

n°373953
MagicBuzz
Posté le 28-04-2003 à 10:50:47  profilanswer
 

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
n°373977
Miles--Teg
Posté le 28-04-2003 à 11:00:57  profilanswer
 

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

n°373985
MagicBuzz
Posté le 28-04-2003 à 11:03:41  profilanswer
 

oui, les ponctuation sont toujours avant les lettres/chiffres

n°374006
Miles--Teg
Posté le 28-04-2003 à 11:13:16  profilanswer
 

é é é é !!
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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Compraison de chaine de caractère

 

Sujets relatifs
[vbscript]- erreur dans la recherche de chaines de caractère[BAT] Concaténer une chaine dans un for
[PHP/JS] Grande chaine de car dans une fonction js.[ASP] tronquer une chaine?
[vb(a)] je veux faire fonction qui separe une chaine de char en deuxlire un caractere de commande en C
[PHP] Récupération d'une partie d'une chaîne de caractèresRecherche dans une chaine
[PHP] recherche de motifs dans une chaîne, regexchaine de longeur fixe [facile mais jy arrrive po]
Plus de sujets relatifs à : Compraison de chaine de caractère


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR