langage C : problème avec scanf
Répondre à la discussion
Affichage des résultats 1 à 21 sur 21

langage C : problème avec scanf



  1. #1
    invitedba13d1f

    Post langage C : problème avec scanf


    ------

    Bonjour,

    Je débute l'apprentissage du langage C et je viens de voir l'utilisation de printf et scanf ... et oui c'est vraiment le début

    Comme à chaque fois que je vois une nouvelle notion, j'ai décidé de faire des essais avec.

    Voilà en simplifié le petit bout de code qui me cause soucis :

    Code:
    int Q1 ;
        char Q2 ;
    
        printf ("Question 1 ?") ;
        scanf ("1%d",&Q1) ;
    
        printf ("Question 2 ?") ;
        scanf ("1%c",&Q2) ;
    
        printf ( "Reponse 1 : %d et Reponse 2 : %c",Q1,Q2) ;
    On peut pas faire beaucoup plus simple mais pourtant ça ne fonctionne pas

    Si j'ai bien compris mon petit cours sur scanf, cette fonction scanne tout une ligne. Si je donne comme réponse le chiffre 1 à la première question, et que je valide par Entrée pour passer à la 2eme, 2 caractères vont être enregistrés.
    Le chiffre 1 qui était attendu par scanf pour Q1, et le retour ligne qui correspond à un caractère et que scanf utilise donc pour Q2.

    Comment je peux faire pour vider le tampon de scanf pour qu'il ne prenne pas en compte mon retour ligne au deuxième appel de la fonction?
    Si ce n'est pas possible, avez-vous une méthode qui permette de réaliser le même objectif que celui que je m'étai fixé?

    J'ai bien pensé à intercaler un 3eme scanf entre les deux autres et dont la valeur ne me servirai pas ... mais il y a peut être mieux !

    Merci beaucoup de votre aide

    -----
    Dernière modification par yoda1234 ; 11/04/2009 à 10h14. Motif: Ajout balise code

  2. #2
    zoup1

    Re : langage C : problème avec scanf

    Bonjour,

    Voilà, tu peux faire quelque chose comme cela en utilisant la fonction getchar();

    Code:
    #include "stdio.h"
    
    int main(){
            int Q1 ;
            char Q2 ;
    
            printf ("Question 1 ?") ;
            scanf ("1%d",&Q1) ;
    
            int c=0;
            while(c=getchar()!='\n' && c != EOF ){
                    ;
            }
    
            printf ("Question 2 ?") ; 
            scanf ("1%c",&Q2) ;
    
            printf ( "Reponse 1 : %d et Reponse 2 : %c\n",Q1,Q2) ;
    
    }
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  3. #3
    invitedba13d1f

    Re : langage C : problème avec scanf

    Merci de ton aide zoup1 !

    J'ai un résultat étrange lorsque j'essaie le code que tu m'a proposé :

    Question 1 ?8
    Question 2 ?d
    Reponse 1 : 2147336192 et Reponse 2 :


    J'ai deux Warning lors de la compilations.

    Le premier dit à propos de la ligne avec while :
    suggest parentheses around assignment used as truth value

    Le deuxième à propos de la dernière ligne (accolade qui fini main) :
    control reaches end of non-void function

    Je vais me renseigner sur while et EOF pour comprendre comment il fonctionne.
    Avez-vous une idée de ce qui pose problème?

  4. #4
    invitedba13d1f

    Re : langage C : problème avec scanf

    J'ai trouvé le pourquoi du deuxième warning.
    Le compilateur attend un retour pour la fonction main.

    J'ai juste ajouté une instruction "return 0 ;" et il a disparu !

    Je me met sur le déchiffrage de la ligne avec while

  5. A voir en vidéo sur Futura
  6. #5
    zoup1

    Re : langage C : problème avec scanf

    Code:
    #include "stdio.h"
    #include "stdlib.h"
    int main(){
            int Q1 ;
            char Q2 ;
    
            printf ("Question 1 ?") ;
            scanf ("1%d",&Q1) ;
    
            int c=0;
            while ( (c=getchar()!='\n')  && (c != EOF) ){
                    ;
            }
    
            printf ("Question 2 ?") ;
            scanf ("1%c",&Q2) ;
    
            printf ( "Reponse 1 : %d et Reponse 2 : %c\n",Q1,Q2) ;
    
            return EXIT_SUCCESS ;
    }
    Le même sans warnings...

    Je ne sais pas exactement ce que tu cherches à faire... mais tels que les scanf sont écrits, il faut que ce que tu rentres commence par 1 (aussi bien pour Q1 que pour Q2) le 1 lui même ne faisant pas partie de ce qui est lu dans la variable. Si tu n'as pas de 1 dans ta saisie, rien n'est lu....
    Code:
    Question 1 ?1232
    Question 2 ?1G
    Reponse 1 : 232 et Reponse 2 : G
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  7. #6
    invitedba13d1f

    Re : langage C : problème avec scanf

    Merci encore une fois zoup1
    J'ai réussi à faire ce que je voulai grâce à toi.

    Pour les scanf qui devaient commencer par 1 ... il s'agissait bien d'une erreur de ma part
    Je voulai utiliser un gabarit pour les scanf pour que la fonction n'attende qu'un seul caractère à chaque fois. Par exemple si l'utilisateur tappait '12' seul le 1 serait pris en compte ... raté de ce côté là !
    J'ai inversé le 1 et le %. scanf ("%1d",&Q1) aurait bien mieux fonctionné !

    Voilà mon code modifié :

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char x ;
        int y, i ;
        float nfois ;
    
    
        /* Petits essais avec printf et scanf. Voir aussi les conversions
     implicites */
    
        printf ("On va commencer par donner le code ASCII d'un caractere
     donne au clavier\n") ;
        printf ("combien de fois veux tu convertir ? ") ;
        scanf ("%1f",&nfois) ;
    
        /* On attend la validation de nfois par l'utilisateur */
        int c=0 ;
        while ( (c = getchar() !='\n') && (c != EOF ))
        {
            ;
        }
    
        /* On réalise la boucle nfois */
        for (i=1 ; i-1<nfois ; i++)
        {
            printf ("\nCaractere a traduire numero %d : ",i);
            x = getchar () ;
    
                int c2=0 ;
                while ( (c2=getchar() !='\n') && (c2 != EOF ))
                {
                    ;
                }
    
            printf ("Le caractere %c a pour code ASCII : %d ",x,x) ;
        }
    
        printf ("\nOn va maintenant faire le contraire !!") ;
        printf ("\nDonnes moi un code ASCII :") ;
        scanf ("%d",&y) ;
        printf ("Le code ASCII %d represente le caractere : %c\n",y,y) ;
        return 0;
    Voilà ce que j'ai comprit du bout de code que tu m'as donné :

    Tant que c ne prend pas la valeur 'fin de ligne' ou 'EOF' on attend (on reste dans la boucle). C'est bien ça?
    J'ai vu que EOF signifie End Of File, mais quel caractère doit on entrer dans le premier scanf pour que c soit interprété comme EOF?

    Merci !

    PS : le programme n'a pas d'autre utilité que de m'exercer !

  8. #7
    Towl

    Re : langage C : problème avec scanf

    La valeur de EOF dépend du système d'exploitation, généralement c'est -1 ou toute valeur ne correspondant pas à un caractère valide.

    Pour le simuler sous Linux, tu peux faire un Ctrl+D

    Dans le cas de ton programme, ce n'est pas forcément utile de tester EOF, mais c'est une bonne habitude à prendre.
    The only limiting factor of the Linux operating system, is his user. - Linus Torvalds

  9. #8
    Philou67

    Re : langage C : problème avec scanf

    Il y a une erreur dans la ligne suivante :
    Code:
    while ( (c = getchar() !='\n') && (c != EOF ))
    Etant donné la précédence des opérateurs, cette ligne est équivalente à :
    Code:
    while ( (c = (getchar() !='\n')) && (c != EOF ))
    alors qu'à mon sens, tu voulais écrire :
    Code:
    while ( ((c = getchar()) !='\n') && (c != EOF ))
    :'( Plus j'apprends, et plus je mesure mon ignorance

  10. #9
    invitedba13d1f

    Re : langage C : problème avec scanf

    Oui tu as raison Philou67.
    Surtout que '!=' a une plus grande priorité que '='.

    Je ne sais pas pourquoi il n'y a pas eu d'erreur au niveau du programme.
    Si je tappai n'importe quel autre caractère que '\n', l'expression
    Code:
     getchar () != '\n'
    aurait du prendre la valeur 1 et ensuite l'attribué à 'c'. La boucle n'aurait pas du fonctionner, non ?

    Merci

  11. #10
    Towl

    Re : langage C : problème avec scanf

    Une affectation est toujours vraie
    Ainsi il est possible d'écrire a = b && c = d, ce qui veut dire 1 && 1 soit 1

    On peut donc s'amuser à faire des codes completement abscons avec cela :
    Code:
    for (i = 0; i < 10 && i += 1; )
    {
      ...
    }
    The only limiting factor of the Linux operating system, is his user. - Linus Torvalds

  12. #11
    whoami

    Re : langage C : problème avec scanf

    Bonjour,
    Citation Envoyé par Towl Voir le message
    Une affectation est toujours vraie
    Ainsi il est possible d'écrire a = b && c = d, ce qui veut dire 1 && 1 soit 1

    On peut donc s'amuser à faire des codes completement abscons avec cela :
    Code:
    for (i = 0; i < 10 && i += 1; )
    {
      ...
    }
    Il y a longtemps que je n'avais pas lu une telle énormité.

    Es-tu sûr d'avoir appris le C ?

  13. #12
    Towl

    Re : langage C : problème avec scanf

    Je ne demande qu'a voir le contraire, mais ormis l'erreur de priorité des opérateurs (pour une fois que je ne mets pas de parenthèses je me plante ) mon code est valide et produit ce que j'annonce (testé avec gcc, vc++ en mode C pur, icc) :
    Code:
    #include <stdio.h>
    
    int main()
    {
    	int a = 0, b = 1, c = 2, d = 3;
    	if((a = b) && (c = d))
    		printf("It works\n");
        printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
        return 0;
    }
    Code:
    $./a.out
    It works
    a = 1, b = 1, c = 3, d = 3
    Es-tu sûr d'avoir appris le C ?
    Un petit conseil, évite ce genre d'affirmation / question. D'une part c'est désobligeant, d'autre part, tu ne connais rien de la personne qui est en face. Et en l'occurence, oui, je peux t'affirmer que j'ai appris le C, et que je le maitrise plutot bien
    The only limiting factor of the Linux operating system, is his user. - Linus Torvalds

  14. #13
    whoami

    Re : langage C : problème avec scanf

    Bonjour,
    Citation Envoyé par Towl Voir le message
    Je ne demande qu'a voir le contraire, mais ormis l'erreur de priorité des opérateurs (pour une fois que je ne mets pas de parenthèses je me plante ) mon code est valide et produit ce que j'annonce (testé avec gcc, vc++ en mode C pur, icc) :
    Code:
    #include <stdio.h>
    
    int main()
    {
    	int a = 0, b = 1, c = 2, d = 3;
    	if((a = b) && (c = d))
    		printf("It works\n");
        printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
        return 0;
    }
    Code:
    $./a.out
    It works
    a = 1, b = 1, c = 3, d = 3

    Un petit conseil, évite ce genre d'affirmation / question. D'une part c'est désobligeant, d'autre part, tu ne connais rien de la personne qui est en face. Et en l'occurence, oui, je peux t'affirmer que j'ai appris le C, et que je le maitrise plutot bien
    Juste pour t'amuser, essaye
    Code:
    	int a = 0, b = 1, c = 2, d = 0;
    	if((a = b) && (c = d))
    		printf("It works\n");
        printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
    Pan sur le bec.

    Et je persiste avec ma question, car tu n'as manifestement pas compris de quoi tu parles, alors que c'est basique en C, et cela met en doute ton affirmation que j'ai mise en gras/bleu ci-dessus.

    Après ton essai avec le code que je t'ai donné, comprends-tu ce qui se passe ?

  15. #14
    invitedba13d1f

    Re : langage C : problème avec scanf

    Ohhh !!

    On se retrouve avec a= 0, b = 0, c = 1, d = 1.

    Je pensai que d prendrai la valeur de c et pas l'inverse

    Et le "It works" n'apparait pas donc les affectations ne prennent pas '1' comme valeur à priori.

    Merci de ta remarque Whoami ... mais pourquoi ces résultats (je débute désolé)?

    Comme quoi, avec au départ une simple petite question sur un scanf, on peut se retrouver avec un post de 10 pages !!

    Merci de votre aide !

  16. #15
    invitedba13d1f

    Re : langage C : problème avec scanf

    Je peux pas éditer mon précédent post ou je n'ai écris que des bêtises (pour rester poli ) donc pour me racheter, voici mon explication du code donné par Whoami :

    Code:
     
    int a = 0, b = 1, c = 2, d = 0;
    	if((a = b) && (c = d))
    		printf("It works\n");
        printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
    Dans une construction avec && (avec || ça marche aussi ) on évalue le second opérateur seulement si sa valeur est déterminante au résulat. Dans notre cas, si (a = b) renvoi une valeur nulle l'expression (c = d) ne sera même pas observée.

    On commence donc par examiner l'expression (a = b). On affecte la valeur de 'b' à 'a'. Donc maintenant a = b = 1.

    Le premier opérande ayant une valeur non nulle, on passe au suivant : (c = d). On affecte la valeur de 'd' à 'c'. Donc désormais c = d = 0.

    On se retrouve donc avec l'expression '1' && '0' qui prend la valeur '0'.
    On n'affiche donc pas «It works» à l'écran.

    Reste plus qu'à afficher les valeurs de a, b, c et d à l'écran.
    On retrouve logiquement nos valeurs a = 1, b = 1, c = 0 et d = 0.

    Effectivement, une affectation renvoie la valeur de son élément le plus à gauche (pas très clair) !

    Exemple :

    Code:
    int a = 0, b = 0;
    if ( a = b)
       printf ( "petit texte") ;
    Il ne s'affichera rien du tout !

    Merci Whoami pour ton exemple.

  17. #16
    polo974

    Re : langage C : problème avec scanf

    Citation Envoyé par gizmo2937 Voir le message
    ...
    Effectivement, une affectation renvoie la valeur de son élément le plus à gauche (pas très clair) !
    ...
    En fait, assez clair: une affectation ne fait que ranger un résultat: donc seule la valeur qu'on va ranger (donc à gauche) compte.

    Par contre pour tout débutant prenant ce fil en cours de route, ATTENTION, ici on joue avec le feu:
    = est une affectation
    == est un test d'égalité
    et l'exemple fait des affectations dans un test, écriture juste si c'est ce qu'on veut (belle Lapalissade...), mais pas des plus joyeuse.

    C'est le (premier) grand piège du C. Il suffit de se rappeler que pour les tests, en C il faut généralement 2 caractères:
    == && || <= >= ... sauf pour < et > (sinon, c'est trop simple)...

  18. #17
    Philou67

    Re : langage C : problème avec scanf

    Citation Envoyé par gizmo2937 Voir le message
    Effectivement, une affectation renvoie la valeur de son élément le plus à gauche (pas très clair) !
    C'est tout à fait clair au contraire, c'est ce qui permet d'écrire :
    Code:
    a = b = 421;
    aussi équivalent à
    Code:
    a = (b = 421);
    :'( Plus j'apprends, et plus je mesure mon ignorance

  19. #18
    Philou67

    Re : langage C : problème avec scanf

    Sinon, pour éviter des erreurs d'usage de "=" au lieu de "==" dans un test, il existe une formulation assez peu utilisée qui permet d'éviter ce genre d'erreur lorsque la comparaison s'opère avec une constante : il suffit d'écrire l'expression constante puis l'expression variable.
    Exemples :
    Code:
    if (a = 421) { // code valide, mais source d'erreur potentielle
      ...
    }
    if (421 = a) { // code invalide, erreur d'inattention évitée
      ...
    }
    :'( Plus j'apprends, et plus je mesure mon ignorance

  20. #19
    polo974

    Re : langage C : problème avec scanf

    Citation Envoyé par Philou67 Voir le message
    ...
    Code:
    a = b = 421;
    et si b est déclaré volatile (ou pas d'optimisation à la compil,), 421 est écrit dans b, puis le contenu de b est lu pour être écrit dans a...

    au passage volatile ne s'oppose pas à const...

  21. #20
    JPL
    Responsable des forums

    Re : langage C : problème avec scanf

    Citation Envoyé par whoami Voir le message
    tu n'as manifestement pas compris de quoi tu parles
    Genre de réflexion inutile et désagréable à éviter. Si tu n'es pas d'accord avec quelqu'un il y a des manières courtoises pour le dire. Cela fait deux fois à quelques messages de distance que tu te comportes ainsi
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  22. #21
    whoami

    Re : langage C : problème avec scanf

    Bonjour,
    Citation Envoyé par JPL Voir le message
    Genre de réflexion inutile et désagréable à éviter. Si tu n'es pas d'accord avec quelqu'un il y a des manières courtoises pour le dire. Cela fait deux fois à quelques messages de distance que tu te comportes ainsi
    [Humour]

    Comme tu le dis si bien, c'est désagréable à éviter.

    [/Humour]

    Je lui avais clairement expliqué qu'il se trompait complètement, et il insiste en donnant un code, qui ne démontre absolument pas qu'il avait raison, puisqu'une simple modification d'une valeur numérique démontre le contraire (alors que d'après lui, ça ne dépend absolument pas des valeurs numériques).

    Et il en profite pour ajouter qu'il maîtrise le langage, ce qui est manifestement faux, puisque ce qui est en cause est basique dans l'apprentissage du C, et qu'il n'a manifestement pas compris.

    Inutile de mettre des grrr ou autres bidules : quand je pense noir ou bleu ou vert, je n'écris pas rose.

Discussions similaires

  1. problème avec le langage pascal
    Par invite49b54ac2 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 28/01/2009, 11h45
  2. problème avec langage C++
    Par invite0f6e0be6 dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 03/10/2007, 11h20
  3. PIC et µC propramable avec langage procedural?
    Par flyingman dans le forum Électronique
    Réponses: 14
    Dernier message: 14/11/2005, 08h34
  4. grosses difficultées avec le langage R!!!!!
    Par inviteb77375f9 dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 20/05/2004, 13h57
Découvrez nos comparatifs produits sur l'informatique et les technologies.