Tri - Chaine - Pointeurs - en c

Résolu
etienn11 Messages postés 3 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 4 septembre 2006 - 5 mai 2005 à 12:10
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 - 5 mai 2005 à 16:09
Bonjour,
Je cherche à trier les lignes d'un fichier (80 car et 100 lignes MAX) en C.
J'y suis arrivé avec le code ci-dessous, mais maintenant j'aimerais pouvoir effectuer le tri non plus sur le début de la ligne, mais par exemple en commençant au 10e caractère.
Je ne vois pas comment faire, quelqu'un peut-il m'aider ?????

Pascal

#include <stdio.h>


main()
{
/* variable */
char LIGNE[80]; /* chaîne pour les lignes du fichier */
char *MOT[100]; /* Pointeurs de car pour les 100 lignes */
char *TMP; /* pour la permutation des pointeurs */
int FIN; /* ligne où la dernière permutation a eu lieu */
FILE *F; /* fichier */
int I,J; /* pour les boucles */
/***********************************/
/* ouverture du fichier et lecture des lignes*/
/***********************************/
F = fopen("d:\\c\\fin\\fic.txt", "r");
for (I=0; I<100; I++)
{
/* Lecture de la ligne */
fgets(LIGNE, 80, F) ;
/* Réservation de la mémoire */
MOT[I] = malloc(strlen(LIGNE)+1);
if (MOT[I])
{
strcpy(MOT[I], LIGNE);
}
}
/***********************************/
/* Tri du tableau */
/***********************************/
for (I=99 ; I>0 ; I=FIN)
{
FIN=0;
for (J=0; J0)
{
FIN=J;
TMP = MOT[J];
MOT[J] = MOT[J+1];
MOT[J+1] = TMP;
}
}
/***********************************/
/* Affichage du tableau trié */
/***********************************/
puts("Tableau trié :");
for (I=0; I<99; I++)
puts(MOT[I]);
while(getchar());
}

4 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
5 mai 2005 à 13:20
Pour commencer au nième caractère de la ligne, remplace

if (strcmp(MOT[J],MOT[J+1])>0)

par

if (strcmp(MOT[J] + n,MOT[J+1] + n)>0)
3
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
5 mai 2005 à 13:26
Je dirais if (strcmp(MOT[J]+10,MOT[J+1]+10)>0),
mais pour le tris du tableau renseigne toi sur qsort (déclarée dans
stdlib.h), ton code sera plus simple et plus rapide.



Tu oublis de liberer les pointeurs du tableau MOT et de fermer le fichier (fclose).



Il manque des headers:


#include <stdlib.h> /* malloc, free */

#include <string.h> /* strcmp */



Je ne sais pas avec quel compilateur tu compiles mais penses a activer
les warnings pour savoir si tu as oublié un header, les déclarations
implicites peuvent etre a l'origine de bugs vicieux.



Remplaces

main() /* déprécié */

{

}

par

int main()

{

return 0; /* fin du programme */

}



Tu veux faire quoi avec ca ?


while(getchar());
3
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
5 mai 2005 à 16:09
qsort ne fonctionne qu'en C, en C++ pour trier une sequence c'est std::sort
3
etienn11 Messages postés 3 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 4 septembre 2006
5 mai 2005 à 15:51
Merci pour votre aide.

Pour ce qui est des headers, libération de pointeurs... merci de me les avoir signalé mais c'est parce ce que j'ai extrait uniquement la partie de mon code qui me posait problème....
Le qsort fonctionne en c ?
Je croyais que ça ne marchait qu'en c++.

Encore merci pour vos réponses rapides.

Pascal.
0
Rejoignez-nous