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

Messages postés
41
Date d'inscription
vendredi 21 décembre 2001
Dernière intervention
2 octobre 2006
- - Dernière réponse : gagah1
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Dernière intervention
3 août 2010
- 22 avril 2006 à 09:57
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
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
38
1
Merci
#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);
}

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 86 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Ombitious_Developper
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Dernière intervention
28 juillet 2008
5
0
Merci
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.
Commenter la réponse de luhtor
Messages postés
85
Date d'inscription
dimanche 5 mars 2006
Dernière intervention
4 août 2014
2
0
Merci
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
Commenter la réponse de zied86
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Dernière intervention
3 août 2010
0
Merci
Si nombre d'élement est grand, utilise qsort(...) et strcmp(...) .
Commenter la réponse de gagah1
Messages postés
41
Date d'inscription
vendredi 21 décembre 2001
Dernière intervention
2 octobre 2006
0
Merci
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...
Commenter la réponse de Manthis
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Dernière intervention
5 septembre 2006
0
Merci
Pourquoi des strcmp ? suffit de comparer le premier caractère..
Commenter la réponse de Zootella
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Dernière intervention
3 août 2010
0
Merci
qsort( (char **)Array, n, sizeof(char *), compare);
ATTENTION: sizeof(char*) retourne 4 octets. Vaut mieux remplacer par la taille maximale de la chaine.
Commenter la réponse de gagah1
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
38
0
Merci
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.
Commenter la réponse de Ombitious_Developper
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Dernière intervention
3 août 2010
0
Merci
J'ai pas remarqué que tu utilises un tableau de pointeur: char* array[];
Commenter la réponse de gagah1

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.