Bonsoir à tous,
dans le cadre de mon programme de chiffrement, j'ai voulu contrôler les saisies de l'utilisateur dans le cas où il ferait une mauvaise saisie qui provoquerait une boucle infinie ainsi que pour des problèmes de sécurité.
Plus précisément, j'ai voulu contrôler l'input suivant :
1 2 3 4 5
| ...
do {
printf("\nR : ");
scanf("%d",&r);
}while(r<0||r>1); |
Si l'utilisateur entre un caractère ou un string, une boucle infinie apparaît. J'ai cherché quelques heures et avec plusieurs essais de suite jusqu'à trouver le code suivant (concluant et qui a résout totalement le problème) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| ...
char buff[1024];
int r;
if(!fgets(buff,1024,stdin))
{
return 1;
}
char *endptr;
errno=0;
r=strtol(buff,&endptr,10);
if(errno==ERANGE)
success=0;
else if(endptr==buff)
success=0;
else if(*endptr && *endptr != '\n')
success=0;
else
success=1;
}while(r<0||r>1||(!success)); |
Cependant, je ne comprends pas quelques trucs dans le code :
- Pourquoi déclarer un pointeur char sur endptr ? (je sais que c'est le premier caractère qui n'a pas pu être converti par la fonction atoi() mais est-il vraiment nécessaire de le déclarer?)
- Je ne comprends pas ce que fait la condition - Et enfin, la troisième condition
else if(*endptr && *endptr != '\n');
; pourquoi utiliser deux pointeurs à la fois ? pourquoi on écrit pas tout simplement Merci à vous
PS : on peut faire plus simple et plus court que ce code ?
Partager