Rechercher : dans
Par :

Scanf marche et pas fgets

Dernière réponse le 1 déc 2008 à 02:16:58 rocksider, le 29 nov 2008 à 21:26:25 
 Signaler ce message aux modérateurs

Bonjour,
dernierement on m'a conseillé de travailler avec fgets à la place de scanf pour + de securité, mais malheuresement il marche pas dans des fcts que j'ai créé comme par exemple là :
void chgpass()
{
char pass[15],pass1[15],pass2[15];
printf("Donner votre ancien mot de passe:");
//fgets(pass,sizeof(pass),stdin);
scanf("%s",&pass);
fflush(stdin);
if(!strcmp(user[actif].pass,pass))
{ ...}
else
{...}

donc quand je travaille avec scanf, ça entre dans la condition, et avec fgets il me renvoi tjr dans le else ...
est ce que je devrai abondonné fgets même si il est meilleur ? l'erreur peu provenir de quoi?

Configuration: Windows XP
Firefox 3.0.4

1

fiddy, le 29 nov 2008 à 21:32:09

Salut,
Plusieurs erreurs dans ton code.
scanf("%s",&pass); Il faut enlever l'esperluette (&).
Ensuite, le fgets marche très bien, mais il ne faut pas oublier que le '\n' va se loger dans la chaîne aussi s'il y a de la place.
Et enfin, il ne faut pas utiliser fflush(stdin). Cela ne marche pas forcément.. Il vaut mieux vider le buffer à coup de fgetc.
Cdlt
Google is your friend

Répondre à fiddy

2

rocksider, le 29 nov 2008 à 21:37:27

Pour l'esperluette c fait je l'ai enlevé, pour l'espace i reste toujours, ça voudrai toujours dire qui y'aurai le '\n' apres le pseudo?
sinon pour le fflush(stdin), j'ai beau chercher à un truc meilleur,d'ailleurs j'avait trouvé le fameux fgetc, mais j'ai pas bien saisis

Répondre à rocksider

3

fiddy, le 29 nov 2008 à 21:41:10

Si tu utilises fgets, et que tu veux enlever le '\n' tu utilises, strchr pour avoir un pointeur sur le \n et le transformer en \0.
Et pour le fflush(stdin), utilise plutôt

int c; while((c=fgetc())!='\n' &&  c!=EOF);

Cdlt
Google is your friend

Répondre à fiddy

4

rocksider, le 29 nov 2008 à 21:51:58

Mercii pour ces précieux info, donc on scanf est plus pratique ?

Répondre à rocksider

5

fiddy, le 29 nov 2008 à 21:53:09

Scanf est assez dangereux en fait, surtout de la façon dont tu l'utilises.
Reprends ton programme avec ton scanf. Et rentre une longue chaîne de caractère. Et admire le résultat ;)
Cdlt
Google is your friend

Répondre à fiddy

6

rocksider, le 29 nov 2008 à 21:59:21

Merci je vais continué avec les fgets alors, et svp (dsl pour le derangement dejà) vous pouvez m'expliquer ce que fait cette boucle ? EOF c'est quoi?
while((c=fgetc())!='\n' && c!=EOF);

Répondre à rocksider

7

fiddy, le 29 nov 2008 à 22:00:35

La boucle permet de lire tous les caractères dans le buffer clavier jusqu'au \n final ou l'interruption Ctrl+D ;)
Google is your friend

Répondre à fiddy

8

rocksider, le 29 nov 2008 à 22:03:46

L'interruption Ctrl+D ? dsl ...

Répondre à rocksider

9

fiddy, le 29 nov 2008 à 22:12:34

C'est pour mettre fin à la ligne directement avec une séquence d'échappement.
Mais, t'inquiète ce n'est pas important. ;)
EOF c'est End Of File. Donc tu le vois notamment en fin de fichiers (caractère final). Eh bien t'imagines que ce caractère vient dans le buffer (grosso modo).
Cdlt
Google is your friend

Répondre à fiddy

10

rocksider, le 30 nov 2008 à 00:31:37

Mercii pour m'avoir eclairci le truc ^^, sinon apres changer les fflush par la ligne que vous m'avez passé il me donne 1 erreur. j'utilise dev-c++ , j code avec du c.
Two few arguments to function fgetc.

et puis j'ai pas su utilisé strchr ...

Répondre à rocksider

11

fiddy, le 30 nov 2008 à 11:32:56

Ah oui, désolé, j'ai fait ça de tête. fgetc(stdin) ou alors getchar() ;)

char *p=strchr(chaine,'\n');
if(p!=NULL) *p='\0';

Cdlt
Google is your friend

Répondre à fiddy

12

 rocksider, le 1 déc 2008 à 02:16:58

Merci beaucoup pour ces précieuse info, merci infiniment ^^

Répondre à rocksider
Collection CommentÇaMarche.net