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

  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

  7. #7
    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
    Oui d'ailleurs je me demande si il existe une différence entre " " et "/0"...
    Oui, la première chaine contient un espace alors que la deuxième est une chaine vide.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Oui d'ailleurs je me demande si il existe une différence entre " " et "/0"...
    Attention à ne pas te tromper. C'est l'antislash qu'il faut utiliser.

  9. #9
    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 diogene Voir le message
    Oui, la première chaine contient un espace alors que la deuxième est une chaine vide.
    Ok merci !

    Citation Envoyé par jeroman Voir le message
    Attention à ne pas te tromper. C'est l'antislash qu'il faut utiliser.
    Oups... c'est vrai. Merci !

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Par défaut
    Citation Envoyé par PyNub Voir le message
    Oui, la première chaine contient un espace alors que la deuxième est une chaine vide.
    Ok merci !
    En fait la premiere chaine que tu as donné, ca n'est pas " ", mais " \0", c'est a dire :
    -espace + fin de chaine.

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Al_th Voir le message
    En fait la premiere chaine que tu as donné, ca n'est pas " ", mais " \0", c'est a dire :
    -espace + fin de chaine.
    D'ailleurs la vrai notation est {' ', '\0'}...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    D'ailleurs la vrai notation est {' ', '\0'}...
    Effectivement, les " sous entendent qu'il y a un caractère '\0' à la fin, my bad !

+ 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