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

Manthis 41 Messages postés vendredi 21 décembre 2001Date d'inscription 2 octobre 2006 Dernière intervention - 20 avril 2006 à 21:35 - Dernière réponse : gagah1 509 Messages postés samedi 28 juin 2003Date d'inscription 3 août 2010 Dernière intervention
- 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
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 21 avril 2006 à 11:40
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);
}

Merci Ombitious_Developper 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de Ombitious_Developper
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 20 avril 2006 à 23:28
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
zied86 85 Messages postés dimanche 5 mars 2006Date d'inscription 4 août 2014 Dernière intervention - 21 avril 2006 à 00:29
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
gagah1 509 Messages postés samedi 28 juin 2003Date d'inscription 3 août 2010 Dernière intervention - 21 avril 2006 à 08:11
0
Merci
Si nombre d'élement est grand, utilise qsort(...) et strcmp(...) .
Commenter la réponse de gagah1
Manthis 41 Messages postés vendredi 21 décembre 2001Date d'inscription 2 octobre 2006 Dernière intervention - 21 avril 2006 à 12:08
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
Zootella 252 Messages postés vendredi 10 juin 2005Date d'inscription 5 septembre 2006 Dernière intervention - 21 avril 2006 à 17:42
0
Merci
Pourquoi des strcmp ? suffit de comparer le premier caractère..
Commenter la réponse de Zootella
gagah1 509 Messages postés samedi 28 juin 2003Date d'inscription 3 août 2010 Dernière intervention - 21 avril 2006 à 19:16
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
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 22 avril 2006 à 00:01
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
gagah1 509 Messages postés samedi 28 juin 2003Date d'inscription 3 août 2010 Dernière intervention - 22 avril 2006 à 09:57
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.