Saisie clavier en c

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

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)