Salute les gens,
Juste une question, pourquoi sscanf ne me rend pas EOF en cas d'erreur sous linux?
Elle me rend des grands nombres négatifs style: -54370 !!
Merci
Version imprimable
Salute les gens,
Juste une question, pourquoi sscanf ne me rend pas EOF en cas d'erreur sous linux?
Elle me rend des grands nombres négatifs style: -54370 !!
Merci
Si sscanf() réussit ses conversions, il retourne le nombre de conversions réussies. Sinon, effectivement, la norme dit qu'il retourne EOF.Citation:
Envoyé par Goundy
Peux-tu montrer le code qui ne fonctionne pas ?Citation:
Envoyé par n1124
Envoie ton code mais il semblerai que tu dépasses la capacité de stokage de ton nombre, ainsi, à cuase du débordement, tu obtiens des nombres négatifs.
Apparement, il s'agit du code retour et non de la valeur convertie...Citation:
Envoyé par PRomu@ld
Bonjour,
Désolé, je n'ai pas posté du code hier, car je me disais que peut être sous linux c'été un peu différent (même si j'ai lus le contraire via Google).
Voilà un bout de code:
Donc, là quand je saisi n'importe quoi, ca ne m'affiche pas le EOF :/Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <stdio.h> unsigned long strToLint (const char* str) //fonction qui convertie une chaine en un entier long non signé // rend l'entier en cas de succes, ou EOF en cas d'echec (erreur dans la chaine) { unsigned long tmp; sscanf (str, "%ld", &tmp); return (tmp); } int main(void){ unsigned long k; char saisi[128]=""; fgets (saisi, sizeof(saisi), stdin); k = strToLint (saisi); if (k == EOF) printf("Erreur dans votre saisie"); return 0; }
Ai-je fais une erreur?
EOF ne tient pas dans un unsigned (il peut etre negatif). De plus tu ne renvoies pas la valeur retour de sscanf() qui est err dans l'expression suivante
mais la valeur issue de l'analyse de la chaine passee en parametre, qui est tmp.Code:
1
2 err = sscanf(str, "%ld", &tmp);
Remarque egalement que ta chaine saisie conserve le '\n' qui n'est pas enleve par fgets. Ta fonction de saisie doit etre amelioree.
EDIT: remarque egalement que tu re-invente la roue. strtol() fait exactement ce que tu souhaites, avec une bonne gestion d'erreur.
Héhé, je suis bête :oops:
Merci ;)
Oui, tu ne testes pas le retour de sscanf(). C'est cette valeur qui peut valoir EOF.Citation:
Envoyé par Goundy
En fait, en cas d'erreur elle retourne 0 (pas de conversion) ce qui est logique. Je ne vois pas bien comment elle pourrait retourner EOF, vu que ce n'est pas un flux...
Code:
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 #include <stdio.h> /* convertit une chaine en un entier long non signe * Retourne 1 en cas de succes (erreur dans la chaine) */ int strToLint (const char* str, unsigned long *p_ul) { return sscanf (str, "%lu", p_ul); } int main(void) { char saisi[128]; fgets (saisi, sizeof(saisi), stdin); { unsigned long k; int n = strToLint (saisi, &k); if (n == 1) { printf ("k = %lu\n", k); } else { printf("Erreur dans votre saisie (n=%d)\n", n); } } return 0; }
Ouais, en fait je croyais que c'été la valeur mise dans tmp qui pouvait valoir EOF :/