Saisie clavier en c

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 060 fois - Téléchargée 19 fois

Contenu du snippet

Cette source permet d faire une saisie clavier +/- sécurisée en C en évitant le scanf. Je pense qu'elle peut-être utile au débutant car je suis moi même débutant et je n'ai pas trouver de saisie propre en C

Elle gère:
la taille des entrées
le type d'entrée (long, double, avertissement)
les avertissements d'erreur
...

Je dois encore faire:
La gestion des caractères spéciaux
La gestion de la taille du tableau avec un malloc(...*sizeof(..))
Toute s vos sugesstion....

Source / Exemple :


fichier .h

#ifndef SAISIECLAVIER_H_INCLUDED
#define SAISIECLAVIER_H_INCLUDED

/** ENUMERATION **/
typedef enum TypeEntree TypeEntree;
enum TypeEntree {
NOMBRE_ENTIER,
NOMBRE_DECIMAL,
CARACTERES
};

/** FONCTIONS **/
void viderBuffer(void);
int lire(char *chaine, int longueur, int Avertissement);
long lireLong(int avertissement);
double lireDouble(int avertissement);

int VerificationEntier (char *Entree);
int VerificationDecimal(char *Entree);

/** AVERTISSEMENT **/
void Avertissement(void);
void AvertissementLongueur(int longueur);
void AvertissementType(enum TypeEntree Entree);

#endif // SAISIECLAVIER_H_INCLUDED

Fichier .c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "SaisieClavier.h"

//TODO: gerer dimension tableau avec malloc.....

/** Vide le buffer clavier **/
void viderBuffer(void)
{
    int c = 0;
    while (c != '\n' && c != EOF)
    {
        c = getchar();
    }
}

/** LECTURE **/
int lire(char *chaine, int longueur, int avertissement)
{
    char *positionEntree = NULL;

    if (fgets(chaine, longueur, stdin) != NULL)
    {
        positionEntree = strchr(chaine, '\n');

        if (positionEntree != NULL) // Correct toute la chaine est la
        {

  • positionEntree = '\0';
return 1; } else //Chaine tronquée { viderBuffer(); if (avertissement==1) AvertissementLongueur(longueur); return 0; } } else { viderBuffer(); if (avertissement==1) Avertissement(); return 0; } } long lireLong(int avertissement) { char nombreTexte[100] = {0}; if (lire(nombreTexte, 100, 1)) { if (VerificationEntier(nombreTexte)==1) { return strtol(nombreTexte, NULL, 10); } else { TypeEntree Entree=NOMBRE_DECIMAL; if (avertissement==1)AvertissementType(Entree); return 0; } } else { return 0; } } double lireDouble(int avertissement) { char nombreTexte[100] = {0}; if (lire(nombreTexte, 100, 1)) { if (VerificationDecimal(nombreTexte)==1) { return strtod(nombreTexte, NULL); } else { TypeEntree Entree=NOMBRE_ENTIER; if (avertissement==1)AvertissementType(Entree); return 0; } } else { return 0; } } /** VERIFICATIONS ENTREE **/ int VerificationEntier (char *Entree) //On verifie qu'il n'y a que des chiffres { char caractereautorise[]="0123456789"; int i=0; //char *test=NULL; for (i=0; i<strlen(Entree); i++)//parcours de l'entrée { //test = strchr(caractereautorise, Entree[i]); if (strchr(caractereautorise, Entree[i])==0) { return 0; } } return 1; } int VerificationDecimal(char *Entree)//On verifie qu'il n'y a que des chiffres, un . ou , { char caractereautorise[]="0123456789.,"; char ponctuation[]=",."; int i=0, nb=0; for (i=0; i<strlen(Entree); i++)//parcours de l'entrée { if (strchr(caractereautorise, Entree[i])==0) { return 0; } } for (i=0; i<strlen(Entree);i++)//boucle pour compter les , et . { if (strchr(ponctuation, Entree[i])!=0) nb++; if (nb>1) { //printf("\nNombre de , ou . superieur à un"); return 0; } } //Remplacement de la virgule par le point... char *positionVirgule = NULL; if (nb==1) { positionVirgule = strchr(Entree, ',');
  • positionVirgule = '.';
} return 1; } /** AVERTISSEMENT **/ void Avertissement(void) { printf ("Une erreur est survenue lors de la saissie"); } void AvertissementLongueur(int longueur) { printf ("La valeur entree est trop longue (Longueur max: %d caracteres)", longueur); } void AvertissementType(enum TypeEntree Entree) { switch (Entree) { case (NOMBRE_ENTIER): printf ("Un nombre entier est attendu:\nUniquement des chiffres"); break; case (NOMBRE_DECIMAL): printf ("Un nombre entier décimal est attendu:\nUniquement des chiffres, un point ou une virgule"); break; case (CARACTERES): printf ("La valeur que vous avez entrée ne correspond pas à ce qui est attendu"); break; default: printf ("Erreur dans le fichier %s: %d",__FILE__, __LINE__); break; } }

Conclusion :


Comme je vous l'ai dit, je débute en C et veux faire profiter les gens de mes codes.

De plus, avec vos remarques, je peux avancer, corriger les erreurs d'approches, corriger ma manière de programmer,...

Donc n'hésitez pas dans vos critiques constructives, remarques, idées d'améliorations, je n'attend que ça.

A voir également

Ajouter un commentaire Commentaires
Messages postés
5
Date d'inscription
mardi 20 janvier 2009
Statut
Membre
Dernière intervention
7 mars 2009

Effectivement la conversation dérape car la première question que je me suis posé en voyant ce code, c’est la portabilité et l’avenir du C et je m’efforce de faire avaler du C, du C++ et du code managé dans des applications console qui acceptent les extensions managées.
Du bidouillage certes mais cela dans un but : utiliser ce qu’il y à de bon dans le C.
Je vois d’ici la réponse, pourquoi utiliser un interpréteur comme le Net Framework alors qu’il serait si simple de passer outre.
La réponse qu’il me vient a l’esprit est celle-ci : Le net Framework n'est bien peut de choses aujourd’hui.
Mais demain ne serait ce pas la solution pour pouvoir en finir avec les problèmes de portabilité.
Le Net Framework serait-t-il portable au même titre que la machine virtuel Java ?
Ceci n’est bien sur que de la science fiction mais je me suis permis d’anticiper sur la pensé des développeurs de chez Microsoft
Mais ce n’est pas le sujet de ce topic !!!
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
7
On dérive un peu du sujet.
Sachez juste que si les Fenêtre vous semble trop compliqué ou trop long (bien qu'en 10 lignes c'est résolu) il vous reste les boîtes de dialogue.
Je vous conseille de voir ici pour un éditeur gratuit et très bien fait : http://www.resedit.net/
Messages postés
5
Date d'inscription
mardi 20 janvier 2009
Statut
Membre
Dernière intervention
7 mars 2009

Certes l’avenir des compilateurs c’est cela au même titre que l’on peut utiliser un éditeur HTML ou PHP pour créer un site en ayant seulement quelques notions de programmation en PHP ou HTML.
Mais n’est ce pas la volonté de MICROSOFT de s’octroyer des monopoles !!!
Alors que faut-il faire ?
Passer par là ou MICROSOFT souhaite nous faire passer, c'est-à-dire sous prétexte de concevoir des utilitaire de plus en plus performants avec des interfaces de plus en plus ergonomique et a la porté de tous, il nous enlève toutes capacité de maitrise d’un langage et tous cela parce que nous même nous allons par la force des choses faire preuve de paresse intellectuelle.
Ou faut il s’émanciper et revenir à programmer en assembleur ?
La portabilité ? Oui mais comment peut on anticiper sur l’avenir.
Personnellement, je ne veux pas cracher dans la soupe, j’aime la politique de MICROSOFT car malgré cela Microsoft nous laisse le choix.
Taper 200 ou 300 lignes de code pour faire apparaitre une fenêtre sous XP ou autre ou cliquer sur projet win32 pour avoir à éviter ce laborieux travail ?
Oui le monde ne s’arrête pas ou s’arrête Windows !!!
Messages postés
88
Date d'inscription
jeudi 9 mars 2006
Statut
Membre
Dernière intervention
7 novembre 2010

Pour répondre à yvesB73, j'ai commencer par développer avec la tecnologie dotnet en VB. (voir mon profil)

Cependant le but de mes programmes n'est pas de devenir un grand parmis les grands (l'informatique n'est pas mon boulot) mais simplement de developper des programmes qui peuvent me simplifier la vie et executer des taches répétitives dans mon travail d'architecte.

Si j'en suis venu à C et espère passer à C++ bientot, c'est plus par soucis de portabilité du code sous linux et éventuellement sous mac et également (à mon sense) une possibilité de comprendre un peu mieux ce que l'on fais. Je ne dits pas que c'est le cas avec C#, mais celui-ci nous propose presque des algorithmes tout fais. Bientot on programmera : Je veux un super programme qui fais cela et ceci et on l'aura ;-)
Messages postés
5
Date d'inscription
mardi 20 janvier 2009
Statut
Membre
Dernière intervention
7 mars 2009

C’est effectivement la réponse que j’attendais en prêchant C#.
Avant de commencer à programmer il faut d’abord connaitre nos propres ambitions.
Devenir un grand parmi les grands ou seulement s’amuser à ce faire ses petits programmes sans prétention ou ambition.
Certes le monde ne s’arrête pas ou s’arrête Windows mais en ce qui me concerne j’étais très pressé de voir s’afficher quelque lignes dans une fenêtre et non dans une console.
Cela dis je suis très admiratif devant ce code source, il reflet un souci de perfection et non de réinventer la roue.
Contrairement a ce que l’on peut lire de partout, je crois qu’il faut comprendre le C pour passer a C# mais sans pour autant trop délirer.
Et pour finir sur un phrase philosophique, je dirais qu’il est difficile de ce connaitre soit même sans connaitre nos ancêtres et ceci est bien à propos quand on parle de l’héritage dans la programmation orientée objet
Afficher les 13 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (agparchitecture)