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 :

Un problème avec scanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Par défaut Un problème avec scanf
    Salut,

    Après avoir lu un cours sur la saisie sécurisée via scanf, j'ai tenté d'écrire un code en faisant exprès de dépasser les nombres de caractères maximales proposés par les tableaux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int main()
    {
        char prenom[10];
        char nom[15];
     
        printf("Comment vous appelez-vous ?\n");
        scanf("%9s %14s", prenom, nom);
        int c;
        while((c = getchar()) != '\n' && c != EOF);
     
        printf("Vous vous appelez %s %s", nom, prenom);
    }
    Lorsque je respecte la limite du nombre de caractère, ça marche, seulement, quand je dépasse sur le tableau prenom (donc le premier renseigné), les caractères en trop sont attribués au tableau nom..
    J'aimerais savoir si il est possible de vider le buffer pour le prénom, car cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((c = getchar()) != '\n' && c != EOF);
    semble ne vider que le buffer lié au tableau nom(le deuxième renseigné).

    Cordialement.

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Par défaut
    et avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        char prenom[10];
        char nom[15];
        int c;
        printf("Comment vous appelez-vous ?\n");
        scanf("%9s", prenom);
     
        while((c = getchar()) != '\n' && c != EOF);
        scanf("%14s",nom);
     
        while((c = getchar()) != '\n' && c != EOF);
        printf("Vous vous appelez %s %s", nom, prenom);
    pour vider ton buffer, tu peut utiliser la fonction fflush :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        char prenom[10];
        char nom[15];
        int c;
        printf("Comment vous appelez-vous ?\n");
        scanf("%9s", prenom);
     
        fflush(stdin);
        scanf("%14s",nom);
     
        fflush(stdin);
        printf("Vous vous appelez %s %s", nom, prenom);

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Par défaut
    Merci pour ta réponse nsanabi, mais n'y a t'il aucun moyens de faire ça en entrant le prénom ET le nom sur un même scanf ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 8
    Par défaut
    À Arkanis, la fonction fflush sur stdin provoque un comportement indéterminé.
    http://c.developpez.com/faq/?page=cl...buffer_clavier
    http://c.developpez.com/faq/?page=cl...S_fflush_stdin

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Par défaut
    A vrai dire, je savais déjà qu'on pouvait faire ce que je veux en passant par deux scanf, et que passer par getchar était préférable à fflush.
    Malheureusement, je ne trouve pas comment ne pas avoir de problème de buffer overflow en passant par un seul et unique scanf =/

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 8
    Par défaut
    Désolé mais j'ai l'impression que ce que tu cherche à faire est impossible.
    Même en utilisant les expressions rationnelles pour forcer l'espace entre les deux formats ça ne marche pas. Il n'accepte pas la saisie tant qu'elle ne respecte pas le format décrit par l'expression rationnelle mais écrit la suite du nom dans le prénom comme d'habitude.
    Jepense que tu est donc de passer soit par deux scanf soit par une fonction my_scanf qui fait ce que tu veux.

Discussions similaires

  1. Problème avec "SCANF"
    Par condor666 dans le forum Débuter
    Réponses: 2
    Dernier message: 28/03/2008, 11h20
  2. Problème avec scanf("%s",str)
    Par mathieumadrid dans le forum C
    Réponses: 4
    Dernier message: 18/12/2006, 16h47
  3. problème avec scanf
    Par mimina dans le forum C
    Réponses: 27
    Dernier message: 13/11/2006, 19h30
  4. problème avec scanf
    Par thierry_b dans le forum C
    Réponses: 10
    Dernier message: 21/12/2005, 20h10
  5. problème avec scanf
    Par troumad dans le forum C
    Réponses: 30
    Dernier message: 20/11/2005, 15h21

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