probleme avec fgets()

probleme avec fgets() - C - Programmation

Marsh Posté le 06-11-2012 à 15:46:20    

Bonjour, je me présente : je suis étudiant dans une fac d'informatique mon prof nous a donné un projet a propos d'expressions post fixés au moyen de chaines de chaines de caractères et de listes chaînées . Je vous passerais les détails sur les listes.
 
voici donc mon code : il se compose de trois fichiers dont "char.h" qui contient les prototypes de "char.c" que voici :
 
/******************  char.c  **********************/
 
#include<stdio.h>
#include<stdlib.h>
 
/* alloue la memoire pour une chaine de caractère */
char *allocMemChar(int nb){
 char *ch;
 ch = malloc(nb*sizeof(*ch));//on alloue la mémoire de manière dynamique
 if(ch == NULL){
  printf("\nIl n'y a pas assez de memoire" );
  exit(0);
 }
 printf("\n la memoire est allouee !" );
 return ch; //renvoie un pointeur
}
 
/* Pour lire une chaine de caractères*/
char *saisieChar(char *ch){
 printf("\nSaisissez votre chaine, puis apppuyez sur Entree : " );
 fgets(ch,sizeof(ch),stdin);//la fameuse fonction fgets()
 return ch;//renvoie aussi un pointeur
}
 
/* Pour afficher une chaine de caractères */
void afficheChar(char *ch){
 printf("\nVous avez saisis : %s",ch);
}
 
/*****************************************************/
 
voici donc maintenant le fichier contenant le programme principal :
 
/********************** testChar.c **********************/
 
#include "char.h"
 
/* Fonction principale */
int main(void){
 int nb = 81;//nombtre de caractères de la chaine
 char *ch;//nouvelle chaine pointée
 ch = allocMemChar(nb);//on alloue la memoire évidement
 ch = saisieChar(ch);//on initialise par saisie à l'entrée standard
 afficheChar(ch);//et on affiche
 while(1);//boucle infinie pour l'execution sous l'invite de commande de windows
}
 
/***************************************************/
 
Prenons un exemple : voici le résultat a l’exécution:
 
la memoire est allouee !
saisissez votre chaine, puis appuyez sur Entree : coucou
vous avez saisis : cou
 
Le voila mon problème : la fonction fgets() ne restitue pas tout la chaine a mois que le probleme vienne de stdin??
Je vous remercie d'une réponse rapide  :)  


Message édité par Mrcharlonien le 06-11-2012 à 16:02:05
Reply

Marsh Posté le 06-11-2012 à 15:46:20   

Reply

Marsh Posté le 06-11-2012 à 16:14:10    

Bonjour !  
 
L'opérateur sizeof est évalué à la compilation, donc sizeof(ch), tel qu'utilisé dans l'appel à fgets est équivalent à sizeof(char *), donc 4 ou 8 selon votre systeme (32/64 bits).
 
Vous devez passer un paramètre supplémentaire à la fonction saisieChar, qui est la taille à laquelle à été alloué le pointeur ch.

Reply

Marsh Posté le 06-11-2012 à 16:27:32    

Merci pour cette reponse si rapide :) sa fonctionne a merveille maintenant .
Pour ceux qui souhaite savoir ce que j'ai modifié voici l'ancienne ligne de char.c
fgets(ch,sizeof(ch),stdin);//la fameuse fonction fgets()
 
et la nouvelle:
fgets(ch,nb*sizeof(ch),stdin);//la fameuse fonction fgets()
 
Il va de soit que le prototype dans char.h a été modifié et l'appel de la fonction aussi.
en tout cas merci et j'espere que cet exemple servira de demo a d'autres gens dans la meme m**** que moi :)


Message édité par Mrcharlonien le 06-11-2012 à 16:29:36
Reply

Marsh Posté le 06-11-2012 à 16:32:39    

Je ne sais pas comment vous l'appelez, mais si le paramètre "nb" est égal à celui que vous avez passé à allocMemChar, alors vous allez droit au dépassement en passant "nb*sizeof(ch)" car :  
 
 * Par définition, sizeof(char) vaut 1,
 * sizeof(char *) vaut 4 ou 8
 
Vous allouez donc un bloc de nb octets et demandez à fgets de lire jusqu'à 4*nb ou 8*nb octets et de les mettre dans le tableau ...
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed