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 :

[scanf] Saisie d'un caractère et arrêt de l'exécution


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2016
    Messages : 7
    Par défaut [scanf] Saisie d'un caractère et arrêt de l'exécution
    Salut a tous !

    J'ai un problème, je veut coder une calculatrice simple lors d'un saisi j'ai un problème de mémoire !
    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	do
    	{
    		printf("Entrer la premiere valeur : ");
    		scanf("%lf", &premiereValeur);
    		viderLaZoneMemoire();
    	}while(sizeof(premiereValeur) != 8); /* tant que la place en mémoire du premier nombre est n'est pas celle d'un double */
    Enfait lorsqu'eux je rentre un caractère le code ne plante pas mais le programme passe a la suite ! or je voulait que la taille en octet saisi d'un double est égale a 8 or celle d'un char et de 1 octet mais le programme continu quand même y'aurait t'il un moyen de faire saisir le type double au lieu d'un type char au quel ont a 7 octet en plus :/

    Merci d'avoir Lu !

  2. #2
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2016
    Messages : 7
    Par défaut
    Ma solution n'a rien de très transcendent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	do
    	{
    		printf("Entrer la premiere valeur : ");
    		scanf("%lf", &premiereValeur);
    		viderLaZoneMemoire();
    	}while(premiereValeur == 0); /*Tant que premiereValeur == 0 *
    /
    Car fait 0 + 1
    Car faire 0 - 1
    Car faire 0 * 1
    Car faire 1 / 0 // erreur
    Car faire 1 % 0

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CaptainFramboise Voir le message
    Ma solution n'a rien de très transcendent
    Bonjour

    Effectivement ce n'est pas très transcendant car aucune de tes 2 solutions ne peut fonctionner.

    Dans la première tu testes si le sizeof() d'une variable de type (que je présume) double est différent de 8. Ben ça marche pas parce qu'un double fait 8 octets donc le test est toujours faux. A ce propos, la norme dit qu'un double fait au-moins 8 octets donc il peut en faire 12 ou 15 donc même là le test aurait dû être "tant que inférieur" et non "tant que différent". Mais même comme ça ça ne change rien car le char saisi va quand-même dans une variable de la bonne taille. Et comme ce n'est pas le char saisi que tu testes mais la variable elle-même...

    La seconde ben tu reboucles si la valeur saisie fait 0 donc en fait tu interdis simplement la valeur 0. Alors ok ça "marchotte" parce qu'un caractère converti en double fait 0 (et encore ça ça dépend probablement de ton architecture) mais ce n'est pas une bonne façon de faire. Que se passera-t-il le jour où tu veux autoriser le 0 ???
    Donc si tu viens demander une aide, faut pas mettre en "résolu" un problème qui ne l'est pas.

    La bonne façon de faire, c'est récupérer la saisie sous forme de chaine, puis tenter de convertir cette saisie en double et reboucler tant que cette conversion échoue (ou arrêter la boucle si la conversion réussi ce qui revient au-même)

    Code c : 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
    double saisieDouble(char *prompt)
    {
    	char tampon[100];
    	double val;
    	while (1)
    	{
    		fputs(prompt, stdout);
    		fgets(tampon, 100, stdin);				// La fonction fgets() récupère toute la saisie sans se préoccuper du format
    		if (sscanf(tampon, "%lf", &val) == 1) break;		// La fonction sscanf() renvoie le nombre de conversion qu'elle a réussi - Suffit donc de tester si ce nombre correspond au nombre de conversion attendues
    		fputs("La valeur saisie est incorrecte - Recommencez\n", stdout);
    	}
    	return val;
    }
     
    int main()
    {
    	double premiereValeur;
    	premiereValeur=saisieDouble("Entrer la premiere valeur : ");
    	printf("La valeur est %lf\n", premiereValeur);
    }

    PS: je ne sais pas comment est écrit la fonction "viderLaZoneMemoire()" et j'ose espérer qu'elle ne fflushe pas stdin mais avec ma solution tu n'en as plus besoin puisque justement fgets() a tout récupéré donc aussi tout nettoyé (enfin jusqu'à concurrence de 99 caractères max mais dans 99% des cas ça suffit)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    je serais curieux de savoir pourquoi on a supprimé mon message, ça sortait des clous de demander au PO s'il pouvait indiquer sa solution ?

  5. #5
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Curieux également, d'autant que supprimer les entrées de message sur un forum c'est franchement une mauvaise idée. Ça flingue toute la trame logique du thread.

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

Discussions similaires

  1. saisie d'un caractère après une valeur dans inputbox
    Par CélineM dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/06/2007, 14h56
  2. Attente de saisie d'un caractère
    Par richard_sraing dans le forum C
    Réponses: 4
    Dernier message: 04/02/2007, 12h24
  3. empecher la saisie d'un caractère dans un édit
    Par Invité dans le forum Access
    Réponses: 7
    Dernier message: 17/01/2007, 15h35
  4. Programmer une boucle de saisie chaine de caractère.
    Par Spike Spiegel dans le forum C
    Réponses: 30
    Dernier message: 02/10/2005, 17h46
  5. Saisie de plusieurs caractère dans une liste déroulante
    Par Oluha dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/03/2005, 14h32

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