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 :

[debutant] Probleme avec le scanf()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 15
    Par défaut [debutant] Probleme avec le scanf()
    Salut a tous,

    Je souhaite faire un menu basique dans lequel l'utilisateur devra repondre des parametres et a la fin, un message s'affiche pour lui demander s'il veu quitter ou continuer.
    Aussi, je souhaite que si l'utilisateur ne rentre pas le choix demandé, et bien que le menu recommence.

    Voila mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    void Load_3()
    <div style="margin-left:40px">int sortie = 0
    int debut;
    char choix, fichier
     
    while (!sortie)
    {
    <div style="margin-left:40px">system(CMDCLS) // efface l'ecran - pas de prob-
    printf("n° debut:");    // la je veu un entier long
    scanf("%d",&debut);
    printf("nom du fichier:");   //la je veux une chaine de caracter
    scanf("%s",&fichier);
    printf("continuer (c) - retour (r) :");   //la je veux c ou r
    scanf("%c",&choix);
     
    switch (choix)
    {
    <div style="margin-left:40px">case 'c':
    sortir = TRUE;
    //autre actions...
    break;
     
    case 'r':
    sortie=TRUE;
    //autres actions ...
    break;
     
    default :
    break;</div>}</div>}</div>
    Merci de votre aide... je galere bien pour faire tous ces menus... si quelqu'un peu m'aider !

  2. #2
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Un conseil: évite le scanf pour des saisies utilisateurs !
    Pourquoi ? Si tu attends un entier et qu'il saisit une chaîne, que va-t-il se passer???

    J'utiliserai plutôt gets par exemple, et ensuite une conversion de la chaîne en entier, avec gestion d'erreur.

    Toujours intéressant, "Pourquoi scanf doit être interdit" : http://www.developpez.net/forums/sho...obl%E8me+scanf

  3. #3
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 15
    Par défaut
    oui j'ai cru comprendre que le scanf c'est pas terrible... c'est pour cela que je demande conseil en fait.
    Alors d'accord pour ton gets, mais esce que tu peux detailler la "conversion de la chaîne en entier, avec gestion d'erreur" pleaze
    merci

  4. #4
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Il existe une fonction strtol par exemple pour convertir une chaîne en long. Il y en a d'autres pour les autres types, me semble-t-il.
    cf. FAQ

  5. #5
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    http://c.developpez.com/faq/c/?page=...RINGS_numtostr

    La FAQ ne semble pas être à jour

    Regarde ICI

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Ti-R
    La FAQ ne semble pas être à jour
    ça sera modifié dans la prochaine version

  7. #7
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Citation Envoyé par gege2061
    ça sera modifié dans la prochaine version
    Ok merci

  8. #8
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par mc_fly
    Alors d'accord pour ton gets
    Jamais gets(). Toujours utiliser fgets() + strchr() + la fonction de conversion qui va bien (e.g. strtol() strtod() etc.) pour ce genre d'applications.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par zooro
    J'utiliserai plutôt gets par exemple,
    gets() est pire que scanf() !

    Tu veux sans doute dire fgets()...

  10. #10
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Oui, c'est exactement ce que je voulais dire !
    C'est mon doigt qui a fourché :-)

  11. #11
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    tu declare un:
    et tu fai un:
    Tu aurais pas un dépassement de memoire?
    Utilise fgets sur stdin pour faire une saisie o clavier.
    Le second argument est le nombre de caracteres max que l'utilisateur peut rentrer comme ca il n'y a pas d'overflow et le 3e argument si je me souvient bien c'est le nom de ta variable de chaine de caractere.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par drcd
    Utilise fgets sur stdin pour faire une saisie o clavier.
    Le second argument est le nombre de caracteres max que l'utilisateur peut rentrer comme ca il n'y a pas d'overflow et le 3e argument si je me souvient bien c'est le nom de ta variable de chaine de caractere.
    Non. Relis ta doc...

  13. #13
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Qu'est ce qui ne fonctionne pas dans ton programme sinon ?

  14. #14
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Déjà si c'est pour faire réafficher le menu au cas où l'utilisateur entre de fausse données, l'intérieur de la boucle je le metterais dans une fonction à part qui renverrais 0 ou 1, comme ca il te reste à tester le retour de la fonction pour savoir si tu dois réafficher le menu ou non
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  15. #15
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 15
    Par défaut
    Citation Envoyé par Ti-R
    Qu'est ce qui ne fonctionne pas dans ton programme sinon ?
    Et bien en fait a la compilation, ya pas de probleme
    Le seul probleme, c'est quand je rentre un caractere a la place du numero... le programme accepte cette reponse alors que ca va pas en fait...
    Si je demande un N°, je veux verifier en fait que l'utilisateur rentre bien un N°
    Si c'est une chaine de caracteres, pareil.

    Et de plus, a la fin de la saise, je demande a l'utilisateur s'il veux continuer ou retourné a la page precendente.

    Merci

  16. #16
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Citation Envoyé par mc_fly
    Le seul probleme, c'est quand je rentre un caractere a la place du numero... le programme accepte cette reponse alors que ca va pas en fait...
    Oui bah il suffit de blinder :

    Tu fait ton scanf et tu verifie que c'est un int ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // Du genre (si le num doit être entre 1 et 5 (au passage) :
    int test = 1;
    do{
        printf("Merci de saisir le numero\n>");
        scanf("%d",&num);
        if(num>=1 && num <=5)test = 0; //blindage
        else("Erreur de saisie (le numero doit etre compris entre 1 et 5)\n\n");
    }while(test); //blindage
     
    //suite

  17. #17
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    mc_fly a écrit :
    Le seul probleme, c'est quand je rentre un caractere a la place du numero... le programme accepte cette reponse alors que ca va pas en fait...
    Voici un exemple d'utilisation de scanf avec les précautions nécessaires (saisie d'un entier, purge du flux stdin, ignorer les caractères qui suivent la saisie d'un nombre entier...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    int nombre = 0;
      int ok = 0;
      int retour;
     
      printf("saisissez un nombre :\n");
      while (!ok){
        retour = scanf("%d%*[^\n]", &nombre);
        printf("retour : %d\n", retour);
        if ( !retour ){
          /* erreur de saisie, on vide le flux */
          int c;
          while ( ((c = getchar()) != '\n') && c != EOF);
     
          printf("on vous a demande de saisir un nombre\n");
          printf("veuillez recommencer :\n");
        }
        else {
          /* reussite de la saisie */
          getchar(); /* on enleve le '\n' restant */
     
          printf("saisie acceptee\n");
          ok = 1;  /* sort de la boucle */
        }
      }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par skip78
    Oui bah il suffit de blinder :

    Tu fait ton scanf et tu verifie que c'est un int ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // Du genre (si le num doit être entre 1 et 5 (au passage) :
    int test = 1;
    do{
        printf("Merci de saisir le numero\n>");
        scanf("%d",&num);
        if(num>=1 && num <=5)test = 0; //blindage
        else("Erreur de saisie (le numero doit etre compris entre 1 et 5)\n\n");
    }while(test); //blindage
     
    //suite
    Marche pas si tu saisies une lettre... Il faut d'abord tester la valeur retournée par scanf()...

    Si tu y tiens, apprends à utiliser scanf() correctement : http://xrenault.developpez.com/tutoriels/c/scanf/ , sinon, évite de parler de ce que tu ne connais pas.

  19. #19
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Marche pas si tu saisies une lettre... Il faut d'abord tester la valeur retournée par scanf()...

    Si tu y tiens, apprends à utiliser scanf() correctement : http://xrenault.developpez.com/tutoriels/c/scanf/ , sinon, évite de parler de ce que tu ne connais pas.
    ... c'était pour montrer le chemin à suivre, je n'ai jamais dit que mon code était complet :/ Ici le blindage s'effectue uniquement pour verifier que le nombre saisi est compris entre 1 et 5.

    De plus je ne fais ca que pour apporter une aide, alors même si je ne donne pas l'intégralité de la solution, je vois pas sur quoi tu peut t'appuyer pour dire que je ne sais pas me servir de scanf ... C'est pas comme si j'avais mis
    non plus

Discussions similaires

  1. [Debutant] Probleme avec BevelBorder
    Par devil26 dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 09/05/2005, 09h41
  2. [debutant]probleme avec wxwidgets
    Par iwky dans le forum wxWidgets
    Réponses: 11
    Dernier message: 23/01/2005, 20h23
  3. [DEBUTANT] Probleme avec glortho
    Par barthelv dans le forum OpenGL
    Réponses: 12
    Dernier message: 23/11/2004, 14h21
  4. [DEBUTANT] probleme avec split ?
    Par matN59 dans le forum ASP
    Réponses: 6
    Dernier message: 23/10/2004, 15h47
  5. Réponses: 2
    Dernier message: 31/08/2004, 11h45

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