Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
1665 connectés 

  FORUM HardWare.fr
  Programmation
  C

  probleme avec fgets()

 



trouvez vous ce topic mal expliqué??


 
0 %
        0 vote
1.  oui
 
 
0 %
        0 vote
2.  non
 
 
0 %
        0 vote
3.  trop long
 

Total : 0 vote (0 vote blanc)
Sondage à 3 choix possibles.
Ce sondage est clos, vous ne pouvez plus voter
 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

probleme avec fgets()

n°2162746
Mrcharloni​en
Posté le 06-11-2012 à 15:46:20  profilanswer
 

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
mood
Publicité
Posté le 06-11-2012 à 15:46:20  profilanswer
 

n°2162758
Farian
Posté le 06-11-2012 à 16:14:10  profilanswer
 

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.

n°2162762
Mrcharloni​en
Posté le 06-11-2012 à 16:27:32  profilanswer
 

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
n°2162765
Farian
Posté le 06-11-2012 à 16:32:39  profilanswer
 

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 ...
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  probleme avec fgets()

 

Sujets relatifs
Probleme de fgets sur une lignesupprimer caractère unicode invalide
Problème fgets suite à changement d'OSprobleme avec fgets
[debutant] - Probleme de saisie avec fgets.Problème pour parser une page web au niveau de fgets().
Probleme fgetsProbleme avec fgets
[c] problème de fgets --> bus error core dumpedProbleme de retour a la ligne avec fgets( )...
Plus de sujets relatifs à : probleme avec fgets()


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR