Bonjour à tous,
Je voudrais créer des fonctions permettant de saisir correctement au clavier des int, long et doubles. J'ai donc utilisé une fonction permettant de lire une chaîne de caractères au clavier que j'avais déjà créée, et converti cette chaîne grâce à atoi, atol ou atod.
Mes fonctions :
Ainsi que ma fonction lire_ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 /* lire_int : lit une chaine de caracteres et convertit en int */ int lire_int(int *d) { int err; char temp[16] = {0}; if((err = lire_ligne(temp, sizeof temp)) == ENTREE_OK) { *d = atoi(temp); } return err; } /* lire_long : lit une chaine de caracteres et convertit en long */ int lire_long(long *l) { int err; char temp[32] = {0}; if((err = lire_ligne(temp, sizeof temp)) == ENTREE_OK) { *l = atol(temp); } return err; } /* lire_double : lit une chaine de caracteres et convertit en double */ int lire_double(double *lf) { int err; char temp[64] = {0}; if((err = lire_ligne(temp, sizeof temp)) == ENTREE_OK) { *lf = atof(temp); } return err; }
J'ai choisi pour mes tableaux de char temporaires la taille 16 pour un int, 32 pour un long et 64 pour un double. Je me disais qu'il serait sans doute possible de choisir plus judicieusement ces tailles. Quelles tailles puis-je donc choisir pour éviter d'occuper trop de mémoire mais en même temps pouvoir saisir convenablement les nombres ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 /* lire_ligne : lit une ligne sur l'entree standard et l'écrit dans un tableau de caractères */ int lire_ligne(char* s, size_t t) { int c; int err; size_t i; /* le pointeur doit contenir une adresse */ if (s != NULL) { /* il faut au moins pouvoir écrire un caractère */ if(t > 0) { i = 0; /* on arrête la lecture à la fin de ligne, ou lorsque qu'il ne reste de la place que pour le caractere de fin de chaîne */ while((c = getchar()) != '\n' && c != EOF && i < t-1) { s[i++] = c; } /* ajout du caractère de fin de chaîne */ s[i] = 0; /* s'est-t'on arrêté de lire car on était à la fin de la ligne ou parce qu'il fallait réserver une place pour le caractère de fin de chaîne ? */ if(c == '\n' || c == EOF) { err = ENTREE_OK; } else { /* il reste sans doute des caractères dans le flux d'entrée, il faut alors le vider */ vider_stdin(); err = ERR_TAILLE_SAISIE; } } else { err = ERR_TAILLE_TAB; } } else { err = ERR_P_NULL; } return err; } void vider_stdin(void) { int c; while((c = getchar()) != '\n' && c != EOF); }
D'autre part, toute autre remarque sur ces fonctions est bienvenue (elles fonctionnent, mais il y a sans doute possibilité d'améliorer).
Par avance, merci.
Partager