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
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum IOErrors {
IO_OK,
IO_ERR_NULL_ARG,
IO_ERR_INPUT,
IO_ERR_FORMAT,
IO_ERR_BUFFER,
IO_ERR_UNKNOWN
};
int get_long(long *number);
int main(void)
{
long choix = 0;
int fin = 0;
int err = IO_OK;
do
{
printf("choisissez (1), (2) ou (3): ");
fflush(stdout);
err = get_long(&choix);
if (choix >= 1 && choix <= 3)
{
fin = 1;
}
} while (err != IO_OK || fin != 1);
printf("choix vaut %ld\n", choix);
return EXIT_SUCCESS;
}
int get_long(long *number)
{
int err = IO_OK;
if (number != NULL)
{
char s_buffer[12] = {0};
if (fgets(s_buffer, sizeof s_buffer, stdin) != NULL)
{
char *pc = strchr(s_buffer, '\n');
if (pc != NULL) /* Saisie OK */
{
long nb;
char *p_end = NULL;
/* On élimine le caractère de fin de ligne du tampon */
*pc = 0;
nb = strtol(s_buffer, &p_end, 0);
if (*p_end == 0)
{
/* Format de l'entrée utilisateur OK */
*number = nb;
}
else
{
/* Erreur dans le format de la saisie */
err = IO_ERR_FORMAT;
}
}
else
{
/* L'entrée utilisateur a été tronquée: il faut vider le tampon */
int c;
while ((c = fgetc(stdin)) != '\n' && c != EOF)
{
/* On ignore les caractères */
continue;
}
err = IO_ERR_BUFFER;
}
}
else
{
/* Erreur durant la saisie */
err = IO_ERR_INPUT;
}
}
else
{
/* Erreur d'argument: number ne doit pas être NULL */
err = IO_ERR_NULL_ARG;
}
return err;
} |
Partager