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
| #include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct
{
char essai[100];
} nb;
/* -tc- Elimine les caracteres non lus par scanf() */
void purge(void)
{
int c;
while ((c = fgetc(stdin)) != '\n' && c != EOF)
{
}
}
int main(void)
{
int N;
int i, j;
nb *test;
int rv;
int ret = 0;
do
{
printf("Donnez le nombre de variable a tester: ");
/* -tc- Pour etre portable, il est conseille de forcer l'affichage
ici en purgeant explicitement le flux de sortie standard */
fflush(stdout);
rv = scanf("%d", &N);
purge();
}
while (rv != 1);
test = malloc(N * sizeof(nb));
if (test != NULL)
{
/* -tc- ATTENTION: les lignes qui suivent ne doivent pas etre executees
lorsque l'allocation n'a pas reussi */
for (i = 0; i < N; i++)
{
printf("Entrez vos propositions: ");
fflush(stdout);
/* -tc- Tu n'utilises pas correctement scanf(). Pour la saisie de
chaines, je prefere fgets(). Au minimum, limite le nombre de
caracteres pouvant etre saisis par scanf(). */
scanf("%99s", test[i].essai);
purge();
}
for (i = 0; i < N; i++)
{
int ok = 1;
for (j = 0; ok == 1 && test[i].essai[j] != 0; j++)
{
/* -tc- Attention a tes conditions. Ceci devrait fonctionner si
la locale est celle par defaut (i.e. "C") */
if ((j == 0 && isdigit((unsigned char) test[i].essai[j])) ||
(isalnum((unsigned char) test[i].essai[j]) == 0 &&
test[i].essai[j] != '_'))
{
ok = 0;
}
}
printf("%s\n", (ok == 1) ? "Oui" : "Non");
}
free(test), test = NULL;
}
else
{
fprintf(stderr, "Erreur: allocation impossible\n");
ret = EXIT_FAILURE;
}
return 0;
} |