IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[Question Bete] f ou pas f!!!


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut [Question Bete] f ou pas f!!!
    Pourquoi gets vous gêne et fgets non?
    Ainsi que pour scanf, printf, ...

    Cra si on prend les cours que j'ai reçu, on nous a toujours appris avec gets, scanf, ... Mais jamais avec le "f". Donc, ancienne, nouvelle école qui bataille, ou la raison est autre.

    Merci
    Vive le C => Quoique pas sympa pour la mémoire de mon PC.

    Seul le chat le savait!!!!

    De la rigueur en programmation est maître mot!!!

  2. #2
    Membre actif Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Points : 252
    Points
    252
    Par défaut
    Il existe une fonction getc qui est rigoureusement identique à fgetc (même interface, même sémantique), sauf que getc est implémenté comme une macro et non comme une vraie fonction C. La différence est que getc peut évaluer plusieurs fois son paramètre flot-de-données, ce qui lui interdit d'être une expression contenant des effets de bord.


    http://www.linux-kheops.com/doc/ansi...00000000000000

    Pikwik

  3. #3
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    bien le bonjour,

    cette question n'est pas bête du tout.

    et les réponses sont dans les faqs
    Pourquoi est-il déconseillé d'utiliser scanf ?
    Pourquoi faut-il utiliser fgets() et non gets() ?

  4. #4
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    les fonctions fkelkechose() ont un rapport avec les FILE * (streams)
    les fonctions kelkechosef() ont un rapport avec le formattage de texte.

    Pour savoir pourquoi il faut utiliser fgets() à la place de gets(), lis le man.

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par theshark85
    Pourquoi gets vous gêne et fgets non?
    Parce que fgets() possede un argument supplementaire (en dehors du stream a lire), c'est le nombre de caracteres a lire. C'est beaucoup plus securise que gets(). man gets le dit d'ailleurs bien:
    Citation Envoyé par man gets
    Never use gets(). Because it is impossible to tell without knowing the
    data in advance how many characters gets() will read, and because
    gets() will continue to store characters past the end of the buffer, it
    is extremely dangerous to use. It has been used to break computer
    security. Use fgets() instead.
    Citation Envoyé par theshark85
    Ainsi que pour scanf, printf, ...
    printf() est rarement critiquee. scanf() est critiquee car elle beaucoup plus compliquee a utilisee qu'il n'y parait.

  6. #6
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    La reponse, est un probleme de securite

    Avec gets tu ne sais pas quel est la taille de la chaine de caracteres que le tye va rentrer donc si tu as
    char buffer[10];

    Si le type rentre aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    Tu debordes, le programme plante. Et si avec un debuger tu regardes les registres tu vois que dans EIP (adresse de la prochaine instruction à executer) se trouve 0x979797, hors 97 est le code ascii de la lettre 'a'.

    Du coup on peux grace à un programme, modifier EIP pour que l'adresse de la prochaine instruction soit une adresse de notre choix, donc du coup le programme execute des instructions qu'il ne devrait pas (avec les droits du programme donc imagine un programme avec le setiud positionné [sous Linux] ce que ca peut engendrer)...
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Merci DaZumba pour le man, j'ai du mal à saisir toutes les nuances en anglais qui quand il s'agit de texte technique, ben comme qui sdirait les nuances sont tres importantes.

    Sinon, Pikwik je sais à quoi servent toutes ces petites fonctions.

    Et merci à tous les autres.

    Sinon pour fscanf c'est la même chose? Mais bon, on m'a toujours déconseillé de l'utiliser.
    Vive le C => Quoique pas sympa pour la mémoire de mon PC.

    Seul le chat le savait!!!!

    De la rigueur en programmation est maître mot!!!

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    fscanf() est aussi difficile a utiliser que scanf(), mais a l'avantage d'etre faite pour lire dans un fichier (meme si cela peut etre stdin). Comme on peut esperer que le fichier en question est formatte, alors on se dit que fscanf() a plus de sens que scanf(). Mais c'est une question de gout. Personnellement, c'est toujours fgets() + strchr() + fonction_de_conversion_qui_va_bien(). Il est possible de creer sa propre bibliotheque de fonctions qui couvrent tous les cas que l'on rencontre habituellement.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Merci pour toutes ces réponses qui m'ont beaucoup éclairé.
    Vive le C => Quoique pas sympa pour la mémoire de mon PC.

    Seul le chat le savait!!!!

    De la rigueur en programmation est maître mot!!!

  10. #10
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 70
    Points : 34
    Points
    34
    Par défaut
    Personnellement, j'ai suivi deux enseignements en C dans deux cursus totalement différents, en fac de maths puis en école d'ingénieurs, et tous les profs que j'ai rencontré utilisaient scanf. On ne m'a jamais parlé de fgets, ni de gets. Et je n'ai jamais constaté d'erreurs à la suite d'un scanf

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Pourquoi gets vous gêne et fgets non?
    Ainsi que pour scanf, printf, ...
    Il convient juste d'utiliser ces fonctions à bon escient!

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par theshark85
    Pourquoi gets vous gêne
    Parce que c'est un bug...
    et fgets non?
    Parce qu'il est possible d'utiliser cette fonction correctement.
    Ainsi que pour scanf,
    Très peu de gens savent utiiliser scanf() correctement. Cette fonction n'est pas à la portée des débutants.
    printf, ...
    Cette fonction n'offre pas de difficultés particulières et est utilisée massivement.
    Car si on prend les cours que j'ai reçu, on nous a toujours appris avec gets, scanf, ...
    Grave (et malheureusement commune) erreur. Des noms, je charge mon lance flammes...
    Mais jamais avec le "f". Donc, ancienne, nouvelle école qui bataille, ou la raison est autre.
    Le 'f' n'a rien à voir.

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par babar56
    Personnellement, j'ai suivi deux enseignements en C dans deux cursus totalement différents, en fac de maths puis en école d'ingénieurs, et tous les profs que j'ai rencontré utilisaient scanf. On ne m'a jamais parlé de fgets, ni de gets. Et je n'ai jamais constaté d'erreurs à la suite d'un scanf
    Montre un peu de code, que je te le plante vite fait...
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Fabrice ROUXEL 1
    Il convient juste d'utiliser ces fonctions à bon escient!
    Et pour gets(), c'est quoi le bon escient ?
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 70
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Des noms, je charge mon lance flammes...
    https://dpt-info.u-strasbg.fr/~dubreuil

    Dans la rubrique DEUG 2 - Algorithmique et Programmation Impérative il y a un joli support de cours au format pdf de 113 pages ...

    scanf est utilisé massivement dans le document, il suffit de lancer une recherche... Puis recherches "fgets". Il y a deux réponses, dans des exemples de code non commenté, dans les dernières pages.

    Deuxième chose : int main() ou int main(void), on ne nous a jamais appris ... main a été introduite de cette façon (page 12) :


    En langage C, un programme principal (sous sa forme la plus rudimentaire) se présente sous la forme d'une suite de déclarations, suivie d'une suite d'instructions, le tout entre accolades et précédé de
    main()


    Bien entendu le cours dispensé en amphi est nettement plus léger, on ne nous a jamais parlé de fgets. On ne nous a jamais non plus dit explicitement que main était une fonction : c'est pas forcément évident pour un débutant qui lit le texte cité ci-dessus. Et c'est la raison pour laquelle beaucoup d'étudiants ne comprennent pas pourquoi il faudrait rajouter un int devant le main, et un return 0; dans cette fonction.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    Ben, la va falloir que tu fasses du lance flamme sur un IUT, ça va pas etre top je pense

    Mais bon, on nous a bien appris gets en nous disant qu'en entreprise il n'en voudrait pas. Mais sans nous dire vraiment pourquoi.

    Et pour le scanf, je comprend mieux pourquoi, il aime pas trop, c'est pas le scanf qui les dérange c'est plutot le niveau de programmation que l'on a quand il nous l'apprenne. Mais bon perso, un petit coup en entreprise et on apprend à programmer beaucoup plus proprement, je sais pas pourquoi d'ailleurs!!!
    Vive le C => Quoique pas sympa pour la mémoire de mon PC.

    Seul le chat le savait!!!!

    De la rigueur en programmation est maître mot!!!

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Emmanuel Delahaye a écrit:
    Et pour gets(), c'est quoi le bon escient ?
    En utilisant gets on fait le choix, en toute connaissance de cause, d'une saisie non formatée qui sera stoquée au final dans un tableau de char.

    Parfois on souhaite formater la saisie et l'on utilisera alors scanf.
    Pour l'exemple, je me souviens de l'usage du code de format %x pour l'enregistrement des donnees d'une séquence sur le flot dans le cadre d'un programme de décodage BCD.

    Conclusion:
    Il convient d'utiliser ces fonctions à bon escient, à savoir ai-je besoin d'une entrée formatée ou non formatée.

    A bon entendeur....

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Fabrice ROUXEL 1
    En utilisant gets on fait le choix, en toute connaissance de cause, d'une saisie non formatée qui sera stoquée au final dans un tableau de char.
    Alors il y a une chose importante que semble ignorer, c'est qu'il n'existe pas de moyen portable d'utiliser gets() de façon fiable. En effet, elle ne dispose pas du paramètre 'taille' qui permet de vérifier si la saisie ne déborde pas. Contrairement à fgets()...

    Donc utiliser gets() , c'est faire le choix d'introduire un bug dans son code. Il n'y a donc aucune bonne raison d'utiliser cette fonction. (Nota, une mauvaise utilisation de gets() peut mener au même résultat).

    OK, pour fgets(), on peut se tromper aussi, mais c'est déjà plus difficile si on suit les regles basiques de bon sens (sizeof)...

    Un peu de lecture...

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/09/2009, 13h35
  2. [typedef]Question bete...
    Par danael dans le forum C
    Réponses: 7
    Dernier message: 30/08/2004, 12h30
  3. [FOREIGN KEY] petite question bete ...
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 16h35
  4. Réponses: 5
    Dernier message: 25/11/2003, 10h02
  5. question bete
    Par hervecourtat dans le forum ASP
    Réponses: 8
    Dernier message: 07/11/2003, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo