Bonjour à tous,
Est-ce qu'il existe une fonction qui teste un paramètre s'il est une valeur numérique ou non? Par exemple si je lui passe la valeur 10 ==> succès sinon elle affiche un message d'erreur.
Merci à tous.
Bonjour à tous,
Est-ce qu'il existe une fonction qui teste un paramètre s'il est une valeur numérique ou non? Par exemple si je lui passe la valeur 10 ==> succès sinon elle affiche un message d'erreur.
Merci à tous.
Salut,
Quel serait le paramètre de ta fonction ?
Car il existe bien strtol(), qui convertit une chaîne en long :
Si tu veux tester un simple caractère, la fonction isdigit() suffit.
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 #include <stdio.h> #include <stdlib.h> int main (void) { char s[] = "201"; char *p_conv = NULL; strtol (s, &p_conv, 10); if(p_conv != NULL) { if(*p_conv == 0) { printf("s peut etre converti en nombre\n"); } else { printf("s ne peut pas etre converti en nombre\n"); } } return 0; }
Bonjour,
en fait je dois passer un paramètre en ligne de commande a ma fonction (arg[0]) et ce paramètre doit impérativemen être une valeur numérique.
J'ai trouvé la fonction isdigit() mais cette fonction opère uniquement sur un seul chiffre à la fois
Eh bien, sers-toi de strtol() comme dans mon exemple.
C'est parfaitement adapté à ton cas.
A noter que dans mon exemple, je ne l'ai pas fait, mais tu peux récupérer le long issu de la conversion. Il est retourné par la fonction.
lorsque j'utilise strtol() et si par exemple je passe en paramètre la valeur "toto", ça serait quoi le résultat? Il faut que dans ce cas un message d'erreur sera affiché
Prends mon exemple et fais différents tests en changeant la chaîne s. (Essaie en mettant "1234" puis "toto").Envoyé par ryadh.naouar
Ce code me semble tout de même assez clair.
N'hésite pas à consulter la doc de strtol().
Tu peux aussi coder une fonction toute simple :
Les parties entre /* --- */ servent à gérer les nombres à virgule.
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 int is_number(char *av) { int i; /* --- */ char flg; flg = 0; /* --- */ for (i = 0; av[i]; i++) { if (! (av[i] >= '0' && av[i] <= '9')) return(write(1, "Nombre invalide !\n", 18), 1); /* --- */ else if (av[i] == ',') flg++; if (flg == 2) return(write(1, "Nombre invalide !\n", 18), 1); /* --- */ } return (write(1, "Nombre invalide !\n", 18), 0); }
Vala, c'est une solution comme une autre.
D'accord je vous remercie. En effet strtol est efficace.
Merci
Cette fonction est loin d'être simple et est horrible :Envoyé par Beldom
- Usage de int au lieu de size_t pour parcourir le tableau.
- En C, ce n'est pas une virgule qui sépare la partie entière de la partie décimale mais un point
- Retours multiples, à éviter
- Si j'envoie NULL en paramètre, que se passe-t-il ?
Pourquoi vouloir faire compliqué quand on peut faire simple ?
Il existe une fonction toute prête...
N'oublie pas de cliquer sur "Résolu" si ton problème l'estEnvoyé par ryadh.naouar
- Utilisation de writeEnvoyé par odsen.s
- Aucun test de retour de l'appel système write
- Ne gère pas les séparations par des .
- et bien crade
bah le plus simple is isdigit sur chaque caractère de la chaine ( + les signes + ou -, et .).
Mais une vraie analyse est assez complexe et nécessite l'usage d'une FSM...Envoyé par souviron34
Entier décimal : [+-]0-9[*]
Réel : [+-]0-9[*][.,[0-9[*]]eE[[+-]0-9[*]]]
oui c'est vrai, mais je ne suis pas certain que la fonction citée strol ne génère pas de coredump si on lui rentre un mauvais caractère....
Envoyé par souviron34
long int strtol (const char *nptr, char **endptr, int base);
Normalement, c'est son job de ne pas planter si la chaine est mauvaise. (évidemment, par chaine on entend quand même quelque chose qui fini par \0)Si endptr n'est pas NULL, strtol() stocke l'adresse du premier caractère invalide dans *endptr. S'il n'y avait aucun chiffre valide, strtol() stocke la valeur originale de nptr dans *endptr. (Donc, si *nptr n'est pas `\0' et si **endptr vaut `\0' en retour, la chaîne entière est valide.)
ok merci millie
C'est dans la norme et c'est parfaitement défini. Les fonctions strto*() arrêtent l'analyse dès qu'un caractères n'est plus convertible. Le pointeur endptr pointe sur le premier caractère non converti.Envoyé par souviron34
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager