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 :

Une question toute bête à propos de scanf


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut Une question toute bête à propos de scanf
    Hello once again

    En grande partie grâce à l'aide reçue sur ce site, je commence à me sentir un poil plus à l'aise avec le langage C, même si mes compétences sont encore largement basiques.

    Ce matin, j'ai rédigé un programme qui fonctionne à ceci près qu'il y a deux endroits où la fonction scanf semble tout simplement être ignorée. Je vous montre l'extrait du code correspondant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    case '2':
    printf("Il y a deux couches dans le milieu \n")
    printf("Entrez les coordonnées i_1 et j_1 d'un point \n");
    scanf( "%f, %f", &i_1, &j_1);
    printf("Entrez les coordonnées i_2 et j_2 d'un point \n");
    scanf("%f, %f", &i_2, &j_2);
    if....... etc
    Quand je fais tourner le programme, il me demande bien:
    "Entrez les coordonnées i_1 et j_1"
    Je les lui rentre et il les accepte.
    Par contre, il me met ensuite
    "Entrez les coordonnées i_2 et j_2"
    Mais cette fois, il ne me laisse pas la possibilité d'entrer les valeurs en question et saute directement à la suite du programme.

    Ca me refait exactement la même chose un peu plus loin dans le code et je ne comprends vraiment pas pourquoi

    Quelqu'un aurait il une idée?

  2. #2
    Membre chevronné
    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
    Points : 1 750
    Points
    1 750
    Par défaut
    La fonction scanf n'est pas simple d'utilisation. Voici un cours qui devrait t'aider : http://xrenault.developpez.com/tutoriels/c/scanf/

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Je constate en effet que ça n'a pas l'air simple. Cela dit, lorsque je compare le programme exemple que j'ai dans mon bouquind e C et la syntaxe que j'ai utilisée dans mon programme, je ne vois pas où est la différence:

    Le code de l'exemple dont je dispose est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int x, y;
    float z;
    printf("Entrez 2 entiers \n");
    scanf("%d, %d", &x, &y);
    printf("Entrez un nombre à virgule \n");
    scanf("%f", &z);
    etc...
    Il me semble que ça ressemble furieusement à ce que j'ai d'un point de vue syntaxique et pourtant dans l'exemple, ça fonctionne, alors que chez moi, non....

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Points : 48
    Points
    48
    Par défaut
    Est ce que tu vois la différence entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%d, %d", &x, &y);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%d  %d", &x, &y);
    ???

  5. #5
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Points : 4 574
    Points
    4 574
    Par défaut
    Citation Envoyé par _concept_ Voir le message
    Est ce que tu vois la différence entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%d, %d", &x, &y);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%d  %d", &x, &y);
    ???
    Que ce soit avec ou sans la virgule dans les guillemets, ça ne change rien à son problème.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    En fait, je pense que le plus simple est que je vous mette les codes en entier. Perso, j'ai eu beau relire dans tous les sens, je n'ai pas vu de différences ni de justification au non fonctionnement du mien:

    Le mien:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include "stdio.h"
     
    int main (void)
    {
    //Longueur du profil:
    int L=13000;
    //Hauteur du profil:
    #int H=2000;
     
    float i, i_1, i_2, i_3, i_4, i_5, i_6, j, j_1, j_2, j_3, j_4, j_5, j_6, x, y, a, b, a_1, b_1, a_2, b_2;
     
    int couches;
    printf("Entrez un nombre de couches compris entre 1 et 3 \n");
    couches=getchar();
    switch (couches)
              {
               case '1':
                           printf ("Il n'y a qu'une couche dans le milieu \n");
                           printf ("Entrez les coordonnées x et y d'un point situé dans le profil \n");
                           scanf("%f, %f", &x, &y);
                           if ((x>0) && (x<13000) && (y>0) && (y<2000))
                              printf("Le point est situé dans la couche 1 \n");
                           else
                              printf("On vous avait dit DANS le profil \n");
               break;
     
               case '2':
                          printf("Il y a deux couches dans le milieu \n");
                          printf("Entrez les coordonnées i_1 et j_1 d'un point à l'interface des deux couches \n");
                          scanf("%f, %f", &i_1, &j_1);
                          printf("Entrez les coordonnées i_2 et j_2 d'un point à l'interface des deux couches avec i_2>i_1\n");
                          scanf("%f, %f", &i_2, &j_2); 
                          if (i_2<i_1)
                             printf("Vous etes myope, on a dit i_2>i_1);
                          a=((j_2-j_1)/(i_2-i_1));
                          b=(j_1-a*i_1);
                          printf("Entrez les coordonnées x et y d'un point avec i_1 < x < i_2 \n");
                          scanf("%f, %f", &x, &y);
                          if ((x<i_1) || (x>i_2))
                             printf("Faux, respecter la condition \n");
                          else
                             printf("Condition respectee \n");
                          if (a*x+b-y>=0)
                             printf("Le point est au dessus de l'interface \n");
                          else
                             printf("Le point est sous l'interface \n");
                     break;
                case '3':
         etc... (même principe avec 3 couches)
    Dans le cas n 2, mon code ignore totalement le scanf quand il s'agit de rentrer i_2 et j_2 et je ne comprends absolument pas pourquoi, d'autant qu'il ne me fait pas d'histoire pour le cas 1, ni pour entrer les valeurs de i_1 et j_1.
    Le problème est exactement le même dans le cas 3, lorsque j'ai 3 couches. Je ne l'ai pas copié ici, mais je pense que si je comprends l'origine du problème dans le cas 2, je pourrai aussi la corriger dans le cas 3.

    Je vous mets à présent l'exemple dont je dispose pour l' utilisation de la fonction scanf:

    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
     
    #include "stdio.h"
     
    main()
    {
    int x, y;
    float z;
     
    printf ("Entrez deux entiers \n");
    scanf(%d, %d", &x, &y);
    printf("Entrez un nombre à virgule \n");
    scanf("%f", &z);
    printf("Voici ce que vous avez saisi \n");
    printf(""%d, %d \n, %f \n", x, y, z);
    return 0;
    }
    Voilà, j'ai eu beau tourner ça dans tous les sens, je n'ai pas vui la dufférence au niveau syntaxique entre les deux programmes dans le cadre de l'utilisation de scanf. Peut être qu'avec plus de recul que celui dont je dispose, mon erreur paraîtra évidente, mais en tout cas, je ne l'ai pas trouvée.

    Dans la foulée, une autre question:

    Dans mon code, quand je dis par exemple "Entrer les coordonnées x et y en respectant i_1 < x < i_2"
    J'ai envisagé ensuite le cas où cette condition ne serait pas respectée, mais ça renvoie juste un message d'erreur marrant sans pour autant arrêter le programme. Que faut il faire pour arrêter le programme si cette condition n'est pas remplie et obliger à recommencer à 0 plutôt que de poursuivre un processus qui ne servira à rien?

  7. #7
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Points : 4 574
    Points
    4 574
    Par défaut
    Excuse-moi mais ton code fonctionne :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    // test.cpp*: définit le point d'entrée pour l'application console.
    //
     
    #include "stdafx.h"
    #include "stdio.h"
     
    int _tmain(int argc, _TCHAR* argv[])
    {
     
    //int x, y;
    //float z;
    // 
    //printf ("Entrez deux entiers \n");
    //scanf("%d, %d", &x, &y);
    //printf("Entrez un nombre à virgule \n");
    //scanf("%f", &z);
    //printf("Voici ce que vous avez saisi \n");
    //printf("%d, %d \n, %f \n", x, y, z);
    //return 0;
     
    //Longueur du profil:
    int L=13000;
    //Hauteur du profil:
    int H=2000;
     
    float i, i_1, i_2, i_3, i_4, i_5, i_6, j, j_1, j_2, j_3, j_4, j_5, j_6, x, y, a, b, a_1, b_1, a_2, b_2;
     
    int couches;
    printf("Entrez un nombre de couches compris entre 1 et 3 \n");
    couches=getchar();
    switch (couches)
              {
               case '1':
                           printf ("Il n'y a qu'une couche dans le milieu \n");
                           printf ("Entrez les coordonnées x et y d'un point situé dans le profil \n");
                           scanf("%f, %f", &x, &y);
                           if ((x>0) && (x<13000) && (y>0) && (y<2000))
    					    printf("Le point est situé dans la couche 1 \n");
     
                           else
                              { printf("On vous avait dit DANS le profil \n");while(1);}
               break;
     
               case '2':
                          printf("Il y a deux couches dans le milieu \n");
                          printf("Entrez les coordonnées i_1 et j_1 d'un point à l'interface des deux couches \n");
                          scanf("%f, %f", &i_1, &j_1);
                          printf("Entrez les coordonnées i_2 et j_2 d'un point à l'interface des deux couches avec i_2>i_1\n");
                          scanf("%f, %f", &i_2, &j_2); 
                          if (i_2<i_1)
                             printf("Vous etes myope, on a dit i_2>i_1");
                          a=((j_2-j_1)/(i_2-i_1));
                          b=(j_1-a*i_1);
                          printf("Entrez les coordonnées x et y d'un point avec i_1 < x < i_2 \n");
                          scanf("%f, %f", &x, &y);
                          if ((x<i_1) || (x>i_2))
                             printf("Faux, respecter la condition \n");
                          else
                             printf("Condition respectee \n");
                          if (a*x+b-y>=0)
                             printf("Le point est au dessus de l'interface \n");
                          else
                             printf("Le point est sous l'interface \n");
                     break;
    			}
    				 return 0;
    }
    Je l'ai passé en mode débogage, et ton i_2 et j_2 prennent bien les valeurs que je rentre.

    Pour ta 2ème question, pourquoi tu mettrais pas un break?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (i_2<i_1)
             {
                    printf("Vous etes myope, on a dit i_2>i_1");
                    break;
             }

  8. #8
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par Jmichou972 Voir le message
    Que ce soit avec ou sans la virgule dans les guillemets, ça ne change rien à son problème.
    Ben si, ça peut influer selon qu'il entre "1 2" ou "1, 2". S'il y a une virgule dans la chaîne de format, et qu'il entre "1 2", alors scanf échoue et le buffer reste plein pour le scanf suivant (qui ne "demande" rien, du coup).

    p.s. : en plus, le code du PO ne compile même pas.... (directives préprocesseur, guillemets, etc.)
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  9. #9
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Points : 4 574
    Points
    4 574
    Par défaut
    Citation Envoyé par Pouic Voir le message
    p.s. : en plus, le code du PO ne compile même pas.... (directives préprocesseur, guillemets, etc.)
    C'est pour ça que je lui ai remis mon code

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Points : 28
    Points
    28
    Par défaut
    Mea Culpa

    C'est moi qui disais des âneries. Mon programme fonctionne en effet correctement (à ceci près que je m'étais gouré dans les signes pour trouver les couches, mais ça ce n'est rien).

    Pour mon histoire de scanf, le Hic venait seulement du fait que j'avais ensuite écritr printf("%f, %f etc...)
    et que moi, quand je rentrai les valeurs, je ne mettais pas de virgule entre elles

    Merci à tous une nouvelle fois

  11. #11
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut
    tu as pensé à fflush(stdin);? cet commande vide le buffer de l'entrée clavier, surtout un code de la touche entrée qui pourrait encore trainer...

  12. #12
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par crashtib Voir le message
    tu as pensé à fflush(stdin);?
    Pas de fflush sur stdin : le comportement n'est pas garanti.

    Utiliser la méthode proposée dans la FAQ : Comment vider le buffer clavier ?

  13. #13
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut
    autant pour moi

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

Discussions similaires

  1. [Débutant] Classe, Constructeur et objet, une question toute bête
    Par OurPleasure dans le forum C#
    Réponses: 14
    Dernier message: 14/01/2015, 15h11
  2. Une petite question toute bête
    Par sebnantes dans le forum VB.NET
    Réponses: 4
    Dernier message: 01/09/2010, 15h58
  3. Question toute bête à propos du CV
    Par mylene1201 dans le forum CV
    Réponses: 4
    Dernier message: 22/10/2009, 18h34
  4. Question toute bête sur le passage de variable
    Par pekka77 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/11/2005, 12h39
  5. [.NET] Une question technique a propos du mode asynchrone
    Par nicknolt dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 08/06/2004, 10h07

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