Tri d'un tableau de chaînes de caractères [Résolu]

Signaler
Messages postés
40
Date d'inscription
vendredi 21 décembre 2001
Statut
Membre
Dernière intervention
2 octobre 2006
-
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
3 août 2010
-
Bonjour,



Je poste ce message car je n'arrive pas à trouver de solution à mon
problème. En fait j'ai un tableau de chaînes de caractères (un char **)
que je voudrais trier par ordre alphabétique.



Quelqu'un pourrait-il m'expliquer comment je peux faire ça?



Merci

9 réponses

Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
35
#include "stdlib.h"
#include "string.h"

int compare(const void *, const void *);


void Tri(char * Array[], unsigned int n)
{
qsort( (char **)Array, n, sizeof(char *), compare);
return;
}


int compare(const void * elem1, const void * elem2)
{
return strcmp( *(char **)elem1, *(char **)elem2);
}
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Commence par faire une fonction qui te retourne la plus grande chaine (suivant l'ordre alphabétique) entre 2 chaines.

Apres, c'est trivial. Ca revient a trier un tableau d'entier, mais en
utilisant la fonction que tu viens de faire comme relation d'ordre.

Note qu'il faut juste réordonner l'autre des pointeurs, rien d'autre.
Messages postés
85
Date d'inscription
dimanche 5 mars 2006
Statut
Membre
Dernière intervention
4 août 2014

tu peux utiluser la fonction "strcmp" qui compare deux chaine de caractere dans la bibliotheque <string.h>.


et voila un exemple de tri


for(i=(l-1);i>0;i=fin)/**l est le nombre d'element***/
{fin=0;
for(j=0;j<i;j++)
if(strcmp(livre[j+1],livre[j])<0)
{fin=j;
//permutation
p=livre[j];
livre[j]=livre[j+1];
livre[j+1]=p;
}
}


Ellouze Zied
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
3 août 2010

Si nombre d'élement est grand, utilise qsort(...) et strcmp(...) .
Messages postés
40
Date d'inscription
vendredi 21 décembre 2001
Statut
Membre
Dernière intervention
2 octobre 2006

Merci beaucoup Ombitious_Developper c'est exactement ce que je cherchais: un tri de tableau en deux fonctions et en plus en utilisant l'algorithme qsort.

Encore mille merci et je suis vraiment bluffé par le nombre de gens qui ont répondu, merci à tous...
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006

Pourquoi des strcmp ? suffit de comparer le premier caractère..
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
3 août 2010

qsort( (char **)Array, n, sizeof(char *), compare);
ATTENTION: sizeof(char*) retourne 4 octets. Vaut mieux remplacer par la taille maximale de la chaine.
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
35
Salut :


1- Pour 530875 Zootella
les comparaisons avec la fonctions "strcmp" sont nécessaires, voire obligatoires.
En effet un seul caractère ne permet pas de décider si une chaine est supérieure à une autre - Pensez au cas où les deux chaines commencent par la même lettre -
Comment faire ? il faut faire des strcmp pour résoudre cette problème.
Tant qu'il égalité on passe aux prochaines lettres.(on doit comparer toutes les chaînes)


2- Pour =128209 gagah1
On a tableau de chaines de caractère, càd de type char ** : c'est un tableau contenant les adresses des chaines de caractères sauvegardées quelque part dans la mémoire. Donc il doit contenir des adresses Pourqu' une case accueille une adresse on réserve 4 octes qui n'est autre que sizeof(char *).

Personnellement je préfère sizeof(char *) au lieu de 4 car c'est plus général et plus générique Dieu seul sait si l'adresse d'un pointeur va être toujours 4 octets.
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
3 août 2010

J'ai pas remarqué que tu utilises un tableau de pointeur: char* array[];