probleme avec fgets() - C - Programmation
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.
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
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 ...
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