Bonjour,
Je viens demander de l'aide car j'ai un problème de compréhension de la fonction qsort avec un tableau de chaine fourni par un fichier txt.
Je m'explique :
J'ai une liste de mot dans un tableau que je veux trier alphabétiquement avec la fonction qsort mais je n'ay arrive pas. Voilà mon code :
J'espère que quelqu'un pourra m'aider.
Merci d'avance
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<conio.h>
#define MAXMOTS 100
#define LONGMOT 20
char dico[MAXMOTS][LONGMOT];
char mot[LONGMOT];
char *pmot;
char *a;
FILE *fd;
//declaration des fonctions
short dichotomie(char dico[MAXMOTS][LONGMOT],char *mot,short nb_mot);
int lecture(char tab[], int taille);
static int compare (void const *a, void const *b)
/* ----- a mon avis là il y a un problème */{
/* definir des pointeurs type's et initialise's
avec les parametres */
char const *const *pa = a;
char const *const *pb = b;
/* evaluer et retourner l'etat de l'evaluation (tri croissant) */
return strcmp (*pa, *pb);
}
//Fonction principale
int main(int argc,char*argv[])
{
int res,i;
short nb_mot=0;
char touche;
char buf[30];
int nb=0;
//ouverture du dictionnaire
//Test que le fichier dico s'ouvre bien
if ((fd=fopen("dico.dat","a+")) == NULL)
{
fprintf(stderr,"\nImpossible d'ouvrir le fichier Dico, creation d'un nouveau Dico");
exit(EXIT_FAILURE);
}
/*Puisqu'il est impossible d'ouvrir le fichier dico, la fin du programme permetra
d'en créé un nouveau avec fopen("dico.dat","w")*/
printf("Combien de mot, voulez-vous entrer ? ");
scanf("%d",&nb);
do
{
lecture(buf, sizeof(buf));
strcpy(dico[nb_mot],buf);
nb_mot++;
} while(nb_mot<nb);
/*tri en mémoire du tableau Dico*/
qsort(dico,nb,sizeof(dico),compare);
/*------------------- et là aussii il y a un problème */ for (i=0;i<nb_mot;i++)
fprintf(fd,"%s\n",dico[i]);
//Fermeture du fichier dico
fclose(fd);
printf("Mot a rechercher : ");
scanf("%s",mot);
system("pause");
return 0;
}
//FONCTION DICHOTOMIE
short dichotomie(char dico[MAXMOTS][LONGMOT],char *mot, short nb_mot)
{
//déclaration des variables
int i=0,j=nb_mot,k,res;
//Traitement
while ((j-i)>1 && res!=0)
{
k=(i+j)/2;
res=strcmp(dico[k],mot);
if (res>0)
j=k;
else
i=k;
/*ce if afin d'atteindre le mot du tableau dico[0]
puisque j-i ne peut qu'être strictement supérieur à 1*/
if (k==0 && res!=0)
res=strcmp(dico[0],mot);
}
//Affectation des valeurs retournées
if (res!=0)
res=0;
else
res=1;
return res;
}
/*Fonction saisie des caractères */
int lecture(char tab[], int taille)
{
char car; /*Initialisation des variables */
int i = 0;
/* on met le caractère tapé dans la variable car */
car=getchar();
do {
/* on place le caractere dans le tableau */
tab[i++] = tolower(car);
/* on continue jusqu'a fin du tableau ou caractere fin de ligne */
} while ( (i<taille-1)&&( (car=getchar()) != '\n'));
/* et on n'oublie pas le caractère de fin de chaine */
tab[i] = '\0';
if (car != '\n') {
/* il faut vider le buffer car trop de caracteres ont ete saisis
par l'utilisateur. Si on les laisse, ils seraient utilises
par le prochain appel a saisieChaine.
*/
while (getchar() != '\n')
;
}
}