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 :

Empecher la saisie d'un caractère


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Empecher la saisie d'un caractère
    Alors un de mes gros problème, je n'arrive pas à sécuriser la saisie dans mes programmes..
    Il faudrait seulement que l'utilisateur puisse rentré des nombres entiers, et afficher une erreur si un caractère est rentré.. j'ai beau tourner le problème dans tous les sens et je trouve pas.. puisque les caractères sont eux même des entiers, j'ai beau chercher sur internet mais rien qui répond à mon problème précisément.

    Amicalement.

  2. #2
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Tu peux faire de la saisie 'sécurisée' avec scanf dans ton cas.
    Il suffit tout simplement de tester le retour de scanf et d'agir si cette condition n'est pas remplie, puis de vider le buffer pour permettre une autre saisie

    scanf renvoie le nombre de paramètres correctement lus.
    Voilà un petit exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
     
    int main(void) {
    	int n;
    	/* On vérifie si scanf renvoie bien 1 */
    	while (scanf("%d", &n) != 1) {
    		/* Si ce n'est pas le cas,
    		 * on vide le buffer, et on redemande avec la boucle while*/
    		int c;
    		while ((c=getchar()) != '\n' && c != EOF);
    	}
    	printf("%d", n);
    	return 0;
    }

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 785
    Points
    23 785
    Par défaut
    D'une manière générale, on « sécurise » la saisie non pas en contraignant la frappe de l'utilisateur mais en contrôlant la validité de ce que l'on a reçu, quitte à rejeter le tout. Ça permet d'obtenir un programme dont le comportement est prévisible en toutes situations, et de diversifier les sources de données.

    puisque les caractères sont eux même des entiers
    Attention à ne pas tout mélanger : les caractères sont des entiers, certes, mais leur valeur n'est pas directement celle du chiffre qu'ils représentent (quand il s'agit de chiffre). Il s'agit de leur rang dans la table des caractères. Et ces chiffres ne se trouvent pour ainsi dire jamais en début de table.

    Si tu veux contraindre un utilisateur à saisir des nombres entiers naturels, il suffit de s'assurer qu'il ne saisit que les caractères « 0 », « 1 », « 2 », « 3 », « 4 », « 5 », « 6 », « 7 », « 8 » et « 9 ».

    À ce stade, il faut donc que tu te penches sur la manière dont ces caractères parviennent à ton programme. Si tu travailles en mode console sous Windows, ou depuis un terminal sous Unix ou Linux, il est possible que ladite console gère elle-même la ligne de l'utilisateur et ne te balance l'intégralité des caractères saisis qu'une fois la touche Entrée enfoncée. Cela permet éventuellement à l'utilisateur de faire des corrections à l'insu du programme avant de valider. Si c'est le cas, alors il faut d'abord demander au terminal de te transmettre tous les caractères, directement. Sous Unix, voir du côté de termios pour cela.

    Ensuite, il faut abandonner les fonctions de saisie automatique telles que scanf() et faire le travail toi-même. C'est-à-dire lire les caractères un par un avec fgetc(), par exemple, ignorer les caractères invalides et stocker les autres. Par ailleurs, le terminal de l'utilisateur dispose peut-être d'un echo local, qui lui affiche tous les caractères qu'il saisit au moment où ils sont envoyés au programme. Il te faudra probablement désactiver cet echo pour retransmettre toi-même les caractères, après n'avoir conservé que ceux qui t'intéressent.

    Enfin, sache qu'il existe des bibliothèques qui gèrent tout cela pour toi. Je ne connais pas bien ce qui ce fait dans ce domaine en mode texte. Par contre, en mode graphique, si tu utilises des contrôles tels que des champs de saisie ou autres, il y a souvent moyen de leur adjoindre des filtres pour que tout ce travail soit fait en amont.

  4. #4
    Invité
    Invité(e)
    Par défaut
    C'est super ! après plusieurs bidouillage sa marche niquel, j'ai pu sécuriser la saisie , je ne savais pas qu'on pouvais mettre en condition un scanf.

    Et oui j'ai lu dans des sources que le fgetc() était bien mieux que le scanf(), mais j'avoue que je comprend rien du tous.. on ne fait que du C pur pour l'instant.. vivement que l'on en voie plus.

    Merci beaucoup !

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 785
    Points
    23 785
    Par défaut
    Citation Envoyé par Pepit074 Voir le message
    Et oui j'ai lu dans des sources que le fgetc() était bien mieux que le scanf(), mais j'avoue que je comprend rien du tous.. on ne fait que du C pur pour l'instant.
    La fonction fgetc() est du C pur. Elle est dans la norme.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    La fonction fgetc() est du C pur. Elle est dans la norme.
    Oui, je viens de demander à mon prof et en effet il ma bien confirmer que le scanf est un bâton de dynamite dont on ne connait pas la longueur de la mèche tous comme le printf, mais on l'utilise tous simplement parcqu'on débute, mais on devrait assez vite mettre tous sa à la poubelle.

    On a attaqué dès aujourd’hui l'initiation au javascript

    Un gros merci pouet_forever, ton bout de code marche niquel, je l'ai un peu améliorer, et maintenant mon code est béton, plus rien ne passe sauf ce que je demande précisement
    Dernière modification par Invité ; 16/11/2009 à 21h19.

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/04/2012, 00h00
  2. Empecher la saisie de caractère accentué
    Par mcorvaisier dans le forum IHM
    Réponses: 10
    Dernier message: 23/04/2009, 09h54
  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. [VB.NET] Empecher la saisie de caractère spéciaux
    Par bloody22 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/07/2005, 11h09
  5. Réponses: 7
    Dernier message: 14/05/2004, 18h22

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