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
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
Compil your life guy!
The Aures Project
Si sscanf() réussit ses conversions, il retourne le nombre de conversions réussies. Sinon, effectivement, la norme dit qu'il retourne EOF.Envoyé par Goundy
Peux-tu montrer le code qui ne fonctionne pas ?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...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 : 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 #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?
Compil your life guy!
The Aures Project
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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![]()
Merci![]()
Compil your life guy!
The Aures Project
Oui, tu ne testes pas le retour de sscanf(). C'est cette valeur qui peut valoir EOF.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 : 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 #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 :/
Compil your life guy!
The Aures Project
Partager