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 :

gets ou pas ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut gets ou pas ?
    Quand je compile un programme avec la fonction gets gcc me dit que c'est une fonction dangereuse. Pourquoi est ce dangereux d'utiliser cette fonction ?

    Existe-t-il une meilleure méthode pour récupérer une chaîne contenant des espaces ? En effet scanf("%s",ma_chaine); ne récupère que la première partie de la chaine entre le début jusqu'au premier espace...

    Merci pour vos réponses.

  2. #2
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Utilise fgets.

    C'est ce qu'il y a de mieux notamment parce que tu peux indiquer le nombre maximum d'octet que tu veux lire alors que gets, ca lit le maximum possible. La faille de sécurité (si mes souvenirs sont bon) s'appelle un buffer overflow. (je te laisse t'en référer a google qui sait mieux que moi ce que c'est). En gros tu dépasse la taille du buffer dans lequel tu stocke tes données et donc, tu en écrase d'autre.

    pour info: scanf récupère un nombre limité d'octets (un vingtaine je crois). C'est pour ca que tu n'as pas toute ta chaine.

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    pour info: scanf récupère un nombre limité d'octets (un vingtaine je crois). C'est pour ca que tu n'as pas toute ta chaine.
    Pas du tout.

    Le problème est que le scanf("%s",...) s'arrête au premier caractère <blanc> trouvé (un caractère pour lequel isspace() est vrai) (et de plus saute les caractères <blanc> qui précèdent).

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Autant pour moi. En tout cas il est préférable d'utiliser fgets. C'est la meilleur solution pour lire une ligne sur l'entrée standard.

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Existe-t-il une meilleure méthode pour récupérer une chaîne contenant des espaces ? En effet scanf("%s",ma_chaine); ne récupère que la première partie de la chaine entre le début jusqu'au premier espace...
    Pour lire la chaîne entière, il faut dire à scanf de continuer la lecture tant que le caractère '\n' n'a pas été rencontré, c'est-à-dire utiliser "%[^\n]" au lieu de "%s". Mais ce n'est toujours pas la meilleure méthode. Pour maîtriser les entrées sorties en C, je t'invite à lire ce tutoriel.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    Utilise fgets.
    C'est ce qu'il y a de mieux notamment parce que tu peux indiquer le nombre maximum d'octet que tu veux lire alors que gets, ca lit le maximum possible. La faille de sécurité (si mes souvenirs sont bon) s'appelle un buffer overflow.
    Oui je vois en rentrant une très longue chaîne on peut écraser d'autres variables, vu que l'allocation mémoire nécessaire au stockage de la chaîne n'est pas connue à l'avance. Le fait de spécifier une longueur maximal pour la chaîne évite ce problème encore faut-il que la place correspondant à la longueur maximale soit réservé réellement en mémoire... Je vais lire un peu la doc sur cette fonction. Merci !

    Citation Envoyé par diogene Voir le message
    Le problème est que le scanf("%s",...) s'arrête au premier caractère <blanc> trouvé (un caractère pour lequel isspace() est vrai) (et de plus saute les caractères <blanc> qui précèdent).
    Oui d'ailleurs je me demande si il existe une différence entre " " et "/0"...

    Citation Envoyé par Melem Voir le message
    Pour lire la chaîne entière, il faut dire à scanf de continuer la lecture tant que le caractère '\n' n'a pas été rencontré, c'est-à-dire utiliser "%[^\n]" au lieu de "%s". Mais ce n'est toujours pas la meilleure méthode. Pour maîtriser les entrées sorties en C, je t'invite à lire ce tutoriel.
    La réponse était donc dans scanf... faut que je sois moins fainéant au niveau des pages de man... Merci pour le tuto

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. CURL fonctionne en GET mais pas en POST
    Par Alexdezark dans le forum Langage
    Réponses: 8
    Dernier message: 16/01/2009, 23h17
  2. Fsockopen fonctionne en get mais pas en post
    Par Defaite dans le forum Langage
    Réponses: 1
    Dernier message: 23/09/2008, 16h43
  3. Pourquoi GET et pas POST
    Par ledawa dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2008, 12h07
  4. getHibernateTemplate.get() récupe pas tout !
    Par gazier20 dans le forum Hibernate
    Réponses: 1
    Dernier message: 18/06/2007, 09h30
  5. [Data] getHibernateTemplate.get() récupe pas tout !
    Par gazier20 dans le forum Spring
    Réponses: 1
    Dernier message: 17/06/2007, 21h52

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