Bonjour,
D'abord je pense qu'il va falloir apprendre à indenter le code parce que là
c'est difficile à lire.
À mon avis le gros problème vient de l'utilisation de scanf. Scanf est une
fonction qui sert à lire des données formattées et n'est donc pas applicable
pour une saisie au clavier puisqu'un utilisateur ne respecte jamais le format
voulu. Sa "simplicité" apparente fait que tout le monde l'enseigne et c'est
ainsi qu'on prend de mauvaises habitudes.
Pour la remplacer on utilise fgets:
char *fgets(char *s, int size, FILE *stream);
Cette fonction permet de récupérer une chaîne de caractères. Pour récupérer un
nombre il faut la convertir avec strtol:
long int strtol(const char *nptr, char **endptr, int base);
C'est un peu plus compliqué je l'admet mais cela évite de faire des erreurs. La
fonction création utilisera donc les fonctions ainsi:
Code :
- char temp[15];
- q=(fichier *)malloc(sizeof(fichier));
- printf("Entrez le nom du fichier: " );
- fgets(q->info.nomfich, sizeof(q->info.nomfich), stdin); //récupération de la saisie
- q->info.nomfich[strlen(q->info.nomfich) - 1 ] = 0; //Suppression du caractère \n à la fin de la chaîne voir le man de fgets
-
- printf("Entrez la taille du fichier: " );
- fgets(temp, sizeof(temp), stdin); //Récupération de la saisie
- q->info.taille = strtol(temp, NULL, 0); //Conversion en un nombre
- printf("fichier: %s, taille: %d\n", q->info.nomfich, q->info.taille); //affichage pour vérifier, à supprimer
|
En remplaçant tous les scanf, cela devrait déjà plus ressembler à quelque chose.
La fonction affichage ne peut pas fonctionner si le répertoire affiché est le
premier de la liste car la variable r n'est pas initialisée (on quitte la boucle
avant l'affectation). Il manquait aussi un ; à la fin de la boucle for pour la
faire tourner "dans le vide".
Code :
- void affichage(liste *tete,char *ch)
- {
- liste *p; fichier *q;
- for(p=tete; p!=NULL && (strcmp(p->info.nom_rep,ch)!=0); p=p->next);
- if (p==NULL)
- printf("ce repertoire n'existe pas \n" );
- else
- {
- printf("%s %s %s\n", p->info.nom_rep,
- p->info.sous_rep1,
- p->info.sous_rep2);
- for(q=p->info.lien; q!=NULL; q=q->svt)
- printf("%s %ld la date de creation est: %d %d %d\n",q->info.nomfich,
- q->info.taille, q->info.datecreation.jour,
- q->info.datecreation.mois, q->info.datecreation.annee);
- }
- }
|
Attention de ne pas oublier les \n à la fin d'un printf. C'est plus pratique
pour lire mais cela permet aussi de s'assurer que le terminal affiche bien ce
que l'on veut, sinon il risque de garder les caractères en buffer en attendant
une hypothétique suite.
Edit: en validant mon message, toutes les tabulations sont passées à la
trappe donc le pb vient peut-être du forum et non de l'indentation.
Message édité par ptitchep le 27-12-2013 à 17:45:59
---------------
deluser --remove-home ptitchep