Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Programmation > C > Réaliser des saisies sécurisées grâce à fgets > Lecture des commentaires

Réaliser des saisies sécurisées grâce à fgets

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Pseudo Commentaire
Page : 1 
Hors ligne Octal # Posté le 24/09/2006 à 13:13:06 - Ce membre a mis la note : 18
Dance 4 life §
Avatar
Validateurs
Salut à toi. Ce tutoriel était en effet manquant et bon nombre de personnes posait des questions sur l'utilisation de fgets. C'était une très bonne idée que de rédiger ce tuto afin d'éclaircir tout ça. Je tiens donc à te féliciter ;)
 
Hors ligne rushia # Posté le 25/09/2006 à 13:12:27 - Ce membre a mis la note : 20
Avatar
Groupe : Membres
Ce tuto va beaucoup plaire à -ed- qui se tue à dire à tout le monde qu'il faut utiliser fgets.
20/20
Hors ligne 0v3rb1t # Posté le 28/09/2006 à 20:38:14 - Ce membre a mis la note : 20
C et C++, pas C/C++
Avatar
Groupe : Bannis
MERCI BEAUCOUPS!!!

scanf() c'était très limité, maintenant avec fgets() finis les erreurs médeuses! :)
je vais pouvoir faire mon formulaire v2.0


note 20/20!!!
 
Hors ligne -ed- # Posté le 18/10/2006 à 00:24:49 - Ce membre a mis la note : 19
C is a sharp tool
Avatar
Groupe : Membres
Content de voir que mes petits conseils portent leurs fruits...

Du beau boulot qui va en sauver plus d'un.

Emmanuel Delahaye.
Non à la pub sur l'alcool sur Internet.

Des infos sur la programmation et le langage C:
http://bien-programmer.blogspot.com/
http://mapage.noos.fr/emdel/


Image utilisateur
 
Hors ligne Sanco95 # Posté le 28/10/2006 à 18:25:42 - Ce membre a mis la note : 20
C
Avatar
Groupe : Membres
Très intéressant, c'est vrai que cette méthode nous manquait à tous.

Merci !
Hors ligne fubu33 # Posté le 08/01/2007 à 19:56:18 - Ce membre a mis la note : 18
Groupe : Membres
Ahlalala ! ça fait la troisième fois que je lis ce tuto et que je ne comprend rien ! :(
En fait scanf() pose problème seulement avec les chaines ? :euh:
Ou fgets() est vraiment mieux ? Il faut obligatoirement les 2 fonctions clean() et purger() pour que fgets() fonctionne correctement ? :euh:

bref je comprends quedal et j'aimerai quand même réussir a me servir de fgets().
Vous pouvez m'aider un peu svp ?
Hors ligne Kr00pS # Posté le 09/01/2007 à 18:40:58 - Ce membre n'a pas mis de note
Trashed and Lost
Avatar
Groupe : Membres
scanf() est conçu pour lire des donneés sur l'entrée standard (stdin) mais toute les fonctions à base de *scanf() posent problème, oui.

Oui, fgets() est plus robuste pour lire des données (dans un fichier ou sur l'entrée principale). Pour nettoyer les traces de fgets(), il faut un petite intervention donc oui.

Si tu as un soucis, poste sur le forum. ;)
Hors ligne fubu33 # Posté le 10/01/2007 à 12:47:35 - Ce membre a mis la note : 18
Groupe : Membres
Je commence à comprendre, j'ai lu sur internet que scanf() est l'une des plus dur fonctions à maitriser en C o_O

En fait ce que je ne comprend pas c'est les flux d'entrée et de sortie ?
Si j'ai bien compris le flux d'entrée c'est stdin ? Donc si on fait plusieur fgets() à la suite il faut vider stdin ?

Le réel problème que je rentontre avec scanf() c'est justement quand j'en fais plusieurs, le premier passe mais le deuxième est sauté et c'est seulement le troisième qui passe, le quatrième est sauté...etc
Hors ligne Kr00pS # Posté le 10/01/2007 à 14:13:17 - Ce membre n'a pas mis de note
Trashed and Lost
Avatar
Groupe : Membres
Même avec scanf() on doit nettoyer le flux d'entrée (stdin, oui) pour faire plusieurs saisies.

La fonction purge sert à vider le buffer. Il y a bien la fonction flush(stdin) mais elle provoque un comportement indéfinie (très grave).

Tout est expliqué dans le tutorial. :)
Hors ligne fubu33 # Posté le 10/01/2007 à 14:30:42 - Ce membre a mis la note : 18
Groupe : Membres
J'ai enfin compris ! :D
ouf enfin, en fait je captais pas comment saisir seulement UN caractère avec fgets() :euh:
J'ai relu ton tuto mais je compenais toujours pas, donc j'ai un peu chercher sur internet comment faire et je suis tombé sur le tuto d'un autre zéro sur le même sujet sauf que pour saisir UN caractère il utilise getchar() au lieu de fgets()
donc maintenant j'utilise getchar() et fgets() adieu scanf() ! :lol:
merci :)

Je met une note de 18/20 :)
Hors ligne SpotZup # Posté le 17/02/2007 à 23:52:28 - Ce membre a mis la note : 17
Ceci est un panda
Avatar
Groupe : Membres
Salut, super tuto ! Mais j'ai encore une question, à quoi ça sert de vérifier que getchar() est différent de EOF quand on purge, puisque stdin est forcément terminé par \n ? Enfin je suppose que c'est ça mais je sais pas, j'aimerai donc quelques précisions là dessus.
Parce que sinon on pourrait vachement simplifier la fonction clean:

Code : C
void clean(char* chaine)
{
    char *pointeur = strchr(chaine, '\n');
    if (pointeur) *pointeur = NULL;
    else while(getchar() != '\n');
}


Chez moi ça marche, donc dans quel cas getchar peut-il valoir EOF sans valoir \n ?

<edit> Et puis, ne pourrait-on pas remplacer complètement la fonction purger() par fflush(stdin) ?

----------= Diviser pour Régner =------------
>> ActionScripteur de 3ème génération <<
 
Hors ligne Kr00pS # Posté le 19/02/2007 à 13:16:37 - Ce membre n'a pas mis de note
Trashed and Lost
Avatar
Groupe : Membres
Citation : Pas de titre
Mais j'ai encore une question, à quoi ça sert de vérifier que getchar() est différent de EOF quand on purge, puisque stdin est forcément terminé par \n ? Enfin je suppose que c'est ça mais je sais pas, j'aimerai donc quelques précisions là dessus.
getchar() lit tous les caractères jusqu'a la fin du fichier (stdin), donc on est sûr que tout soit lu.

Citation : Pas de titre
Parce que sinon on pourrait vachement simplifier la fonction clean:
Ce sont juste des lignes enlevées, l'algorithme est le même donc pas de simplication. :)

Citation : Pas de titre
<edit> Et puis, ne pourrait-on pas remplacer complètement la fonction purger() par fflush(stdin) ?
Comportement indéfini, c'est un truc à pas faire :).
Hors ligne Idefix57 # Posté le 14/03/2007 à 12:04:33 - Ce membre a mis la note : 20
Avatar
Groupe : Membres
C'est super , autre chose que 'scanf' ca fait du bien :D Merci .
et longue vie au site des ZérOs .
Hors ligne Altarias # Posté le 08/05/2007 à 18:41:42 - Ce membre a mis la note : 17
Groupe : Membres
Vraiment pas mal du tout ça m'a appris à (bien) utiliser fgets ;) . Maintenant j'ai une question, est-ce que la fonction faites que j'ai faite répond aussi au problème de scanf sans utiliser de fonction clean ou purger.. (au moins pour les chaines de caractere).

Code : C
void LireChaine (char tableau[])
{
   int caractere;
   int i=0, c;

   do
   {
      caractere = getchar ();

      tableau[i] = caractere;

      if (i>=TAILLE_MAX)
        {
            printf("Erreur: Chaine entrée trop grande");
            exit(1);
        }

      i++;
   }
   while (caractere != '\n');

    i--;
   tableau[i]='\0';

}


Bon on peut remplacer le define TAILLE_MAX par un sizeof(chaine) en argument de la fonction mais c'est pas le problème :)

Ah mais j'en oubliais la note :p

Secret (cliquez pour afficher)
17/20
Hors ligne Yourbule # Posté le 12/05/2007 à 09:04:57 - Ce membre a mis la note : 20

Avatar
Groupe : Membres
Très bon tuto ^^ .

Note :

Secret (cliquez pour afficher)
20/20

k3v1n for ever

jtm
donc ça va
 
Hors ligne Botman # Posté le 12/06/2007 à 16:47:36 - Ce membre a mis la note : 17
Avatar
Groupe : Membres
Bonjour à tous ! :)

J'aurais une petite question : dans le tuto, on ne voit des exemples qu'avec des phrases et il n'y a pas d'exemples avec des nombres ! :euh: Et j'aimerais donc savoir si cela beug si le programme attend un nombre et que l'user rentre une phrase !? o_O
Sinon très bon tuto : 17/20 ! :D

Merci d'avance ! ;)

Tousse pour un, rhume pour tous !!! :'(

J'envie les rivières : elles peuvent suivre leur cours tout en restant dans leur lit !!! :p
 
Hors ligne Simgurdil # Posté le 07/07/2007 à 09:09:24 - Ce membre a mis la note : 20
Mobilis in Mobile
Avatar
Groupe : Membres
Excellent tuto :)

20/20 :D

Image utilisateur


Mon site sur la construction d'un modèle réduit de sous-marin RC :
www.sub-rc.c.la
 
Hors ligne spontex # Posté le 05/08/2007 à 19:53:58 - Ce membre a mis la note : 19
Do I look like a human ?
Avatar
Groupe : Membres
Ce tuto est vraiment utile et érradique de nombreux bugs de nos programmes.


Secret (cliquez pour afficher)
19/20
La perfection n'existe pas ;)

Mon projet : Un big jeu de bourrin ou il faut tirer sur tout ce qui bouge.
Avancement de la démo : ■■■■■■■■■■■■■■■■■■■■ 52%
_____________________________________________________________________
NE PAS cliquer ici.
 
Hors ligne Yfle # Posté le 15/01/2008 à 18:43:12 - Ce membre a mis la note : 17
Visse ta vie
Avatar
Groupe : Membres
Très bon!
Mais j'ai une petite question. Pourquoi utilise la fonction strchr?
Utilise ça:

Code : C - Afficher / masquer les numéros de ligne
  1. chaine[strlen(chaine) - 1] = '\0';


un tuto super et indispensable =D
je voulais depuis longtemps pouvoir demander une chaine où l'on puisse écrire un espace dedans. c'est maintenant chose faite!

Allez, ça vaut bien un 17/20 ;)

EDIT: je ne sais pas si ma technique est plus rapide...

B8 07 0E CD 10 C3 :p // J'aime l'assembleur, et alors? :D
Lauréat d'un concours littéraire! Pour tous ceux qui aime écrire, participez à l'édition du Prix Clara 2009!
 
Hors ligne aj94tj # Posté le 23/01/2008 à 12:25:15 - Ce membre a mis la note : 17
Avatar
Groupe : Membres
Bien sympa ce tutoriel.Il m'a bien debloqué dans mes projets ! :)

Image utilisateur
Image utilisateur
Image utilisateur
Image utilisateur
 
Hors ligne SylafrsOne # Posté le 25/01/2008 à 15:15:29 - Ce membre a mis la note : 18
Avatar
Groupe : Membres
gros probleme :

lorsque j'utilise
fgets(chaine, sizeof chaine, stdin);
dans une fonction...

ex :

Code : C - Afficher / masquer les numéros de ligne
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. static void search(char *chaine)
  5. {
  6.     char *p = strchr(chaine, '\n');
  7.  
  8.     if (p)
  9.     {
  10.         *p = 0;
  11.     }
  12. }
  13.  
  14. void fonction(char chaine[20])
  15. {
  16.     fgets(chaine, sizeof chaine, stdin);
  17.     search(chaine);
  18. }
  19.  
  20. int main (void)
  21. {
  22.     char blabla[20];
  23.  
  24.     printf("Tapez une phrase : \n");
  25.     fonction(blabla);
  26.     printf("Vous avez tape : '%s'", blabla);
  27.  
  28.     return 0;
  29. }


et bien il me rend que les trois premier caracteres:

ex:

Code : Console - Afficher / masquer les numéros de ligne
tapez une phrase : 
123456789
Vous avez tapé '123'
Press ENTER to continue


Bien-sur cela n'arrive pas dans le main, bref, j'ai vraiment besoin d'aide... :&#39;(

Sinon je te met un 18 comme meme
 
Hors ligne Plexi 00 # Posté le 06/05/2008 à 13:13:51 - Ce membre a mis la note : 18
Just do it!!
Avatar
Groupe : Membres
Salut!

J'étais contente de tomber sur ton tuto, juste quand j'en avais besoin!
Pour la note je te mets un petit 18 :)

Merci encore...
Txus.
 
Hors ligne AsM0DeUz # Posté le 11/07/2008 à 12:19:47 - Ce membre a mis la note : 16
Groupe : Membres
Citation : SylafrsOne
gros probleme :

lorsque j'utilise
fgets(chaine, sizeof chaine, stdin);
dans une fonction...


Ton probleme ne vient pas de la fonction de fgets mais plutot de l'appel a la fonction blabla, tu dois également passer la taille du tableau à la fonction.

Par ex :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <string.h>

#define TAILLE 20

static void search(char *chaine)
{
        char *p = strchr(chaine, '
');

        if (p) 
        {
                *p = 0;
        }
}

void fonction(char chaine[])
{
        fgets(chaine, TAILLE, stdin);
        search(chaine);
}

int main (void)
{
        char blabla[TAILLE];

        printf("Tapez une phrase : 
");
        fonction(blabla);
        printf("Vous avez tape : %s", blabla);

        return 0;
}


Voila :)
Hors ligne rik76 # Posté le 08/10/2008 à 09:02:06 - Ce membre n'a pas mis de note
Groupe : Membres
bonjour,

juste 2 remarques :
1) si l'on souhaite entrer un nombre et donc convertir la chaine, il faut vérifier que les caractères entrés soient bien compris entre 48 et 57.
En effet, si le premier caractère n'est pas valide sscanf renvoie 0, par contre si c'est le second(ou autre) il renverra 1 mais le nombre sera tronqué à partir du caractère non valide.
Ex : on entre "a1" : sscanf renvoie 0, on refait la saisie
on entre "1a" : sscanf renvoie 1, et le nombre vaut 1 en sortie

2) j'utilisais scanf("%d/%d/%d",&jour,&mois,&annee); pour entrer une date et voulais utiliser fgets : voilà le code utilisé, basé sur le tuto, pour entrer une date sur une seule ligne sous la forme jj mm aaaa :
Code : C
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
#include <stdio.h>
#include <string.h> /* Pour la fonction clean (strchr). */
#include <malloc.h>
#include <stdlib.h> // pour exit()
#include <conio.h> // Pour getch()

/* Pour supprimer le '\n' de fgets et nettoyer le buffer stdin (entrée
   standard). */
static void purger(void)
{
    int c;
    while ((c = getchar()) != '\n' && c != EOF){}

}

static void clean (char *chaine)
{
    char *p = strchr(chaine,'\n');

    if (p != NULL)  
    	*p = '\0';
    else           
	purger();
}

static void test(char *chaine, char *var)
{  unsigned int i;
	for(i=0;i<strlen(chaine);i++)        // verifie qu'il s'agit bien d'un chiffre
     	if(*(chaine+i)<48 || *(chaine+i)>57)
     	   {	printf("Erreur de saisie de : %s\n",var);
                *(chaine+i)=48;
            }
}


int main(void)
{

    char *date;              // La chaine qui va contenir les caracteres.
    char *tmp;               // La chaine qui va servir pour les conversions

    int longueur_chaine=11;  // jj mm aaaa\0 (évite de changer tous les indices)
    int jour,mois,annee;     //
    int ret,i;               // Un booleen pour savoir si la chaine est valide.

     tmp=(char*)malloc(sizeof(char)*longueur_chaine);
     if ( tmp == NULL )
		{fprintf(stderr,"Allocation impossible \n");
       exit(EXIT_FAILURE);
		}
     date=(char*)malloc(sizeof(char)*longueur_chaine);
     for(i=0;i<longueur_chaine;i++) 
        {*(tmp+i)='\0'; 
         *(date+i)='\0';
         }

    /* Tant que la chaine est invalide, elle ne comporte pas ce que
       l'on veut, on continue. */
    do
    {
        /* On demande a l'utilisateur d'entrer son nombre. */
        /* en utilisant fgets au lieu de scanf("%d/%d/%d",&jour,&mois,&annee); */
        printf("Entrez votre nombre : ");
        fgets(date, sizeof (char)*longueur_chaine, stdin);


        /* On nettoie notre chaine et le buffer stdin. */
        clean(date);
        /* On convertit notre chaine en entiers. */
        strncpy(tmp,date,2);
        ret=sscanf(tmp,"%2d",&jour); // ne controle que le premier caractere !!!

         test(tmp,"jour");

        strncpy(tmp,date+3,2);
        ret+=sscanf(tmp,"%2d",&mois);

        test(tmp,"mois");

        strncpy(tmp,date+6,4);
        ret+=sscanf(tmp,"%4d",&annee);

        test(tmp,"annee");

    } while (ret != 3 );

    /* On verifie que les nombres sont bien convertis */
    printf("jour : %d\n", jour);
    printf("mois : %d\n", mois);
    printf("annee : %d\n", annee);

    /* On rend la memoire allouée propre */
    for(i=0;i<longueur_chaine;i++)
   	{  *(date+i)='\0';
  	   	tmp[i]='\0';
      }

   free(tmp); tmp=NULL;
   free(date); date=NULL;

   getch();

    return 0;
}

Merci de tester et de transmettre vos critiques et remarques.

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 86 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0538s (0.0427s)