Tri - Chaine - Pointeurs - en c

[Résolu]
Signaler
Messages postés
3
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
4 septembre 2006
-
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
-
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

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
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)
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
4
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());
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
4
qsort ne fonctionne qu'en C, en C++ pour trier une sequence c'est std::sort
Messages postés
3
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
4 septembre 2006

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.