Scanf ne repond pas
Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

Scanf ne repond pas



  1. #1
    Claude-23

    Scanf ne repond pas


    ------

    Bonjour a tous.

    en tan que debutant, je voulais faire une petite calculette avec Case.

    dont voici mon programme:
    Code:
    int main(int argc, char *argv[])
    { 
    int nombre1 = 0;
    int nombre2 = 0;
    int resultat = 0 ;
    int menue = 0;
    
    printf(" Entrez votres 1er nombre: ");
    scanf("%ld\n ", &nombre1);
    printf(" Entrez votres 2er nombre: ");
    scanf("%ld\n ", &nombre2);
    printf("\n addition       = 1 \n soustraction   = 2 \n Multiplication = 3 \n division       = 4\n");
    
    scanf(" votre choix de 1 a 4 %ld", &menue); 
    switch (menue)
                  {
           case 1:
                printf(" Addition !\n");
                resultat = nombre1 + nombre2;
                break;
           case 2:
                 printf("Soustraction !\n");
                 resultat = nombre1 - nombre2;
                 break;
           case 3: 
                printf("Multiplication !\n");
                resultat = nombre1 * nombre2;
                break;
           case 4:
                printf("Division !\n");
                resultat = nombre1 / nombre2;
                break;
           default:
                printf(" vous n'avez pas tipe comme il faut\n");
                break;   
                }
                   printf("  Resultat est de = :\n", resultat);
                     
      system("PAUSE");	
      return 0;
    }
    Malheureusement, le premier nombre was etre demande, et il me faut donner un nombre decimal? (24,2) apres cette donnée il affiche:
    tous les contenues de printf et scanf j'usqu'a la fin, sans attendre les données.
    je travail pour l'intant sur un lap-top vista, Dev-C++ 4.9.9.2

    -----
    Dernière modification par Jack ; 23/11/2016 à 18h16. Motif: Ajout balises code

  2. #2
    albanxiii
    Modérateur

    Re : Scanf ne repont pas

    Bonjour,

    Le format pour un flottant est %f. Avec un %d scanf s'attend à un entier.

    @+
    Not only is it not right, it's not even wrong!

  3. #3
    Chanur

    Re : Scanf ne repont pas

    Là, les nombres sont de type "int". Le format correspondant de scanf est %d et non %ld

    A priori (c'est le cas actuellement presque partout) les "int" sont sur 4 octets et les "long" sur 8 octets.
    scanf va donc écrire 8 octets à l'adresse de nombre1, puis 8 octets à l'adresse de nombre2.
    Ce qu'on appelle un écrasement, dont la doc précise que l'effet est indéterminé (et c'est rien de le dire ... ).
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  4. #4
    Jack
    Modérateur

    Re : Scanf ne repont pas

    Je virerais également le \n dans le scanf

  5. A voir en vidéo sur Futura
  6. #5
    Claude-23

    Re : Scanf ne repont pas

    Merci encore pour vos reponses
    j'ai donc essayé de supprimmer le "l " de ld, mais j'ai le meme resultat.
    quand au "\n" je ne vais pas les supprimmer, je ne veux pas tout avoir sur une seul ligne.

    Comme deja dit plus haut, le 1er nombre va etre demandé,( un nombre decimal ???)
    apres la rentrée du 1er nombre, il ne demande plus rien, mais affiche tout, sauf le dernier scanf(" votre coix de 1 a 4 %ld", &menue);

    Mon logiciel est le DevC++

  7. #6
    Chanur

    Re : Scanf ne repont pas

    Citation Envoyé par Claude-23 Voir le message
    Merci encore pour vos reponses
    j'ai donc essayé de supprimmer le "l " de ld, mais j'ai le meme resultat.
    quand au "\n" je ne vais pas les supprimmer, je ne veux pas tout avoir sur une seul ligne.

    Comme deja dit plus haut, le 1er nombre va etre demandé,( un nombre decimal ???)
    apres la rentrée du 1er nombre, il ne demande plus rien, mais affiche tout, sauf le dernier scanf(" votre coix de 1 a 4 %ld", &menue);

    Mon logiciel est le DevC++
    Tu confonds scanf et printf. La chaîne de caractère donnée à scanf ne va pas s'afficher. C'est printf qui fait ça.
    - le \n ne va pas s'afficher mais exiger qu'on donne un \n. Le format "%s\n " demande un \n suivi d'un blanc (plus le \n qui termine la saisie).
    - le format " votre choix de 1 a 4 %d" va attendre qu'on ait saisi " votre choix de 1 a 4 " avant de lire la valeur à affecter à "menue".

    Le format à donner à scanf pour lire un int est "%d". Ajouter quelque chose à ce format veut dire qu'on veut lire plus de choses qu'un int.

    En d'autre termes, si tu essayais la solution qu'on te propose, plutôt que de dire que tu ne veux pas mais que du coup, ça ne marche toujours pas ?



    De plus l'affichage printf(" Resultat est de = :\n", resultat); va afficher :
    Code:
     Resultat est de = :
    ce qui ne renseigne pas beaucoup sur la valeur trouvée ...
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  8. #7
    Dlzlogic

    Re : Scanf ne repont pas

    Bonjour,
    Je me permettrais un conseil. Au lieu de demander successivement le premier nombre, puis le second, puis l'opération, demandez ine ligne de la forme 25.6 x 4.25 =
    Ca parait plus difficile, mais, je pense que c'est plus formateur.
    Donc, commencez par écrire l'algorithme, c'est à dire la logique des opérations à effectuer, pour la traduction en code, on vous aidera.
    Pour l'instant, oubliez les fonctions scanf, printf, switch etc et n'écrivez qu'en français.

  9. #8
    Claude-23

    Re : Scanf ne repont pas

    J`ai changer le code, comme vous me l'indiquié : et cela me donne le meme resultat

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    { 
    int nombre1 = 0;
    int nombre2 = 0;
    int resultat = 0 ;
    int menue = 0;
    
    printf(" Entrez votres 1er nombre:\n ");
    scanf("%d ", &nombre1);
    printf(" Entrez votres 2er nombre: \n");
    scanf("%d", &nombre2);
    printf("\n addition       = 1 \n soustraction   = 2 \n Multiplication = 3 \n division       = 4\n");
    printf("votre choix, de 1 a 4\n");
    scanf(" %d", &menue); 
    switch (menue)
                  {
           case 1:
                printf(" Addition !\n");
                resultat = nombre1 + nombre2;
                break;
           case 2:
                 printf("Soustraction !\n");
                 resultat = nombre1 - nombre2;
                 break;
           case 3: 
                printf("Multiplication !\n");
                resultat = nombre1 * nombre2;
                break;
           case 4:
                printf("Division !\n");
                resultat = nombre1 / nombre2;
                break;
           default:
                printf(" vous n'avez pas tipe comme il faut\n");
                break;   
                }
                   printf("  Resultat est de = :\n", resultat);
                     
      system("PAUSE");	
      return 0;
    }

  10. #9
    Jack
    Modérateur

    Re : Scanf ne repont pas

    retire les espace des "%d".
    il manque le %d la où tu veux afficher le résultat dans le dernier printf

  11. #10
    albanxiii
    Modérateur

    Re : Scanf ne repont pas

    Citation Envoyé par Claude-23 Voir le message
    Comme deja dit plus haut, le 1er nombre va etre demandé,( un nombre decimal ???)
    Avec un %d vous ne pouvez entrer qu'un nombre entier. Exemples : 2 ou bien 654981 ou bien 123, mais pas 2.3 ou 3.14

    @+
    Not only is it not right, it's not even wrong!

  12. #11
    Chanur

    Re : Scanf ne repont pas

    A un moment, il faut consulter la doc : page man de scanf (ce n'est pas du tout spécifique à Linux : c'est du C standard, applicable à tous les compilateurs).
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  13. #12
    Claude-23

    Re : Scanf ne repont pas

    Merci pour tous ceux qui m'on aide,

    La solution est en definitif tout simple, il ne doit pas y avoir d'espace dans les FSCAN. et il faut utiliser egalement " FFLUSH(stdout)".
    voici le Programm final


    Code:
    #include <stdio.h>
    
    int main()
    { 
    	int nombre1  = 0;
    	int nombre2  = 0;
    	int resultat = 0;
    	int menue	 = 0;
    	
    	printf(" Entrez votres 1er nombre: ");
    	fflush(stdout);
    	scanf("%d", &nombre1);
    	printf(" Entrez votres 2er nombre: ");
    	fflush(stdout);
    	scanf("%d", &nombre2);
    	printf("\n addition       = 1 \n soustraction   = 2 \n Multiplication = 3 \n division       = 4\n");
    	printf("votre choix, de 1 a 4 : ");
    	fflush(stdout);
    	scanf("%d", &menue);
    	switch (menue)
    	{
    		case 1:
    		   printf(" Addition !\n");
    		   resultat = nombre1 + nombre2;
    		   break;
    		case 2:
    		   printf("Soustraction !\n");
    		   resultat = nombre1 - nombre2;
    		   break;
    		case 3:
    		   printf("Multiplication !\n");
    		   resultat = nombre1 * nombre2;
    		   break;
    		case 4:
    		   printf("Division !\n");
    		   resultat = nombre1 / nombre2;
    		   break;
    		default:
    		   printf(" vous n'avez pas tipe comme il faut\n");
    		   break;
    	}
    	printf("  le Resultat est de = %d:\n", resultat);
    	
    	
    	return 0;
    }

  14. #13
    Chanur

    Re : Scanf ne repont pas

    Citation Envoyé par Claude-23 Voir le message
    il faut utiliser egalement " FFLUSH(stdout)".
    Tiens, c'est curieux.
    Je croyais que la lecture sur l'entrée standard provoquait un flush de la sortie standard.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  15. #14
    pm42

    Re : Scanf ne repont pas

    Citation Envoyé par Chanur Voir le message
    Tiens, c'est curieux.
    Je croyais que la lecture sur l'entrée standard provoquait un flush de la sortie standard.
    Bonne remarque. Je viens de faire le test avec gcc sur OSX et effectivement, pas besoin du fflush.
    Je ne sais pas si ça dépend du compilo/environnement et là, je n'ai pas le temps de lire la doc.

  16. #15
    Claude-23

    Re : Scanf ne repont pas

    Le fflush est a la place des "\n" avec les scanf. mon problme n'estai que les espaces dans les scanf.
    Merci encore pour vote aide a tous.

  17. #16
    Dlzlogic

    Re : Scanf ne repont pas

    Bonjour,
    Sauf création de mémoire tampon avec setbuf(), les flux stdin et stdout n'utilisent pas de mémoire tampon, la fonction fflush() est alors sans effet.

  18. #17
    Philou67

    Re : Scanf ne repont pas

    Les fonctions de la librairie stdio utilisent une mémoire tampon. Et Chanur a ajouté la précision nécessaire concernant le flush réalisé sur scanf.
    :'( Plus j'apprends, et plus je mesure mon ignorance

Discussions similaires

  1. question bête sur la scanf en c
    Par caissa dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 02/01/2014, 16h43
  2. Problèmes avec scanf et double
    Par AmigaOS dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 09/01/2011, 17h14
  3. langage C : problème avec variable globale et scanf
    Par invitedba13d1f dans le forum Logiciel - Software - Open Source
    Réponses: 18
    Dernier message: 21/06/2009, 13h55
  4. langage C : problème avec scanf
    Par invitedba13d1f dans le forum Logiciel - Software - Open Source
    Réponses: 20
    Dernier message: 20/04/2009, 18h41
  5. pop 3 ne répond plus !
    Par sylvainj2 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 25/01/2005, 12h25