#1 Le 02/11/2007, à 00:37
- Chiuchu
[Résolu] Question sur le tri de tableau en C
Bonjour,
J'ai un tableau de noms en C et je voudrais le trier par ordre alphabétique. Je ne veux pas récrire une fonction pour ça (pourquoi réinventer la roue), mais je n'arrive pas à me servir de qsort pour arriver à mes fins.
C'est un code que je produis dans le seul but d'apprendre à maîtriser un peu mieux le C :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char CH15[16];
typedef struct
{
CH15 nom;
} Contact;
Contact c[100];
int name_compare( a, b )
{
return strcmp( a, b );
}
int main()
{
int i, j;
CH15 nom;
do
{
puts("nom ?");
gets(nom);
strcpy(c[0].nom, nom);
puts("ok\n");
i++;
}
while(strcmp(nom, "x") != 0);
qsort( c, i, sizeof(Contact), name_compare );
for(j = 0; j < i; j++)
{
printf("%s\n", c[j].nom);
}
return EXIT_SUCCESS;
}
Dans le tableau Contact c, j'aurai par exemple :
c[0].nom = "Salut!";
c[0].nom = "blabla";
c[0].nom = "alphabet";
c[0].nom = "test";
Voilà, j'ai testé tout plein de façons de faire, j'ai essayé de comprendre comment ca fonctionne mais rien, j'y arrive pas. GCC me renvoi systématiquement l'erreur :
attention : passing argument 4 of «qsort" from incompatible pointer type
Vraiment épuisé, je m'en réfère à vous.
Merci.
Dernière modification par Chiuchu (Le 02/11/2007, à 01:33)
Hors ligne
#2 Le 02/11/2007, à 01:13
- AuraHxC
Re : [Résolu] Question sur le tri de tableau en C
Il est un peu tard donc j'ai pas les idées super clair mais est ce que ca marche pas mieux comme ca :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char CH15[16];
typedef struct {
CH15 nom;
} Contact;
Contact c[100];
int name_compare( a, b ) {
return strcmp( a, b );
}
int main() {
int i, j;
CH15 nom;
int (*compare)(const void *,const void *);
compare = name_compare;
do {
puts("nom ?");
gets(nom);
strcpy(c[0].nom, nom);
puts("ok\n");
i++;
} while (strcmp(nom, "x") != 0);
qsort( c, i, sizeof(Contact),compare);
for (j = 0; j < i; j++) {
printf("%s\n", c[j].nom);
}
return EXIT_SUCCESS;
}
En tout cas ca compile, avec des warning...
nicolas@nicolas-laptop:~$ cd Desktop && gcc -Wall qsort.c -o qsort
qsort.c: In function ‘name_compare’:
qsort.c:14: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast
qsort.c:14: warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast
/tmp/ccavLK7v.o: In function `main':
qsort.c:(.text+0x50): warning: the `gets' function is dangerous and should not be used.
Après faut voir si ca fonctionne réellement mais bon c'est un début, moi je vais me coucher
Parce que j'ai quand même cours demain...
Dernière modification par AuraHxC (Le 02/11/2007, à 01:15)
Hors ligne
#3 Le 02/11/2007, à 01:33
- Chiuchu
Re : [Résolu] Question sur le tri de tableau en C
Salut,
Merci énormément pour la réponse ! Malgré qu'elle n'ait pas l'air de marcher, elle m'a beaucoup aidé à trouver la solution.
La solution est là (un petit peu plus compliquée que prévu) :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char CH15[16];
typedef struct
{
CH15 nom;
} Contact;
Contact c[100];
int compare_noms(const void *a, const void *b)
{
return strcmp( (*(Contact *)a).nom, (*(Contact *)b).nom );
}
int main()
{
int i=0, j;
CH15 nom;
do
{
puts("nom ?");
gets(nom);
strcpy(c[i].nom, nom);
puts("ok");
i++;
}
while(strcmp(nom, "x") != 0);
qsort(c, i, sizeof(Contact), compare_noms);
for(j = 0; j < i; j++)
{
printf("%s\n", c[j].nom);
}
return EXIT_SUCCESS;
}
Merci encore !
Hors ligne