Bonjour tous le monde,
dans mon code j'ai une vérification sur une chaîne de caractère si elle présente un nombre, j'utilise alors:
Est ce qu'il y a d'autre moyen ????Code:
1
2
3
4
5
6
7
8 if( !atoi(chaine) ) { .... }
Version imprimable
Bonjour tous le monde,
dans mon code j'ai une vérification sur une chaîne de caractère si elle présente un nombre, j'utilise alors:
Est ce qu'il y a d'autre moyen ????Code:
1
2
3
4
5
6
7
8 if( !atoi(chaine) ) { .... }
atoi() est vraiment basique au niveau traitement d'erreur. De plus, 0 est un nombre.
Tu as deux solutions:
- boucler sur tous les caracteres de la chaine et verifier que isdigit() renvoit une valeur non nulle pour chacun;
- utiliser strtol() en verifiant que la conversion s'est arretee au '\0' final.
Une mise en oeuvre possible serait de voir si chaque caractère de la chaîne à tester se situe dans la fourchette '0' à '9'. Si ce n'est pas le cas, la chaîne n'est pas un nombre.
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
33
34
35
36
37
38
39
40 #include <stdio.h> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 int main(int argc, char *argv[]) { size_t len; unsigned int i; int valid = TRUE; char c; if(argc == 2) { len = strlen(argv[1]); for(i = 0; i < len; i++) { c = argv[1][i]; if ((c < '0') || (c > '9')) { valid = FALSE; break; } } if(valid == FALSE) printf("La chaine n'est pas un nombre entier.\n"); else printf("La chaine est nombre entier.\n"); } else printf("Veuillez passer une chaine en argument du programme."); return EXIT_SUCCESS; }
Le problème c'est que c'est assez dépendant du jeu de caractère. Cela implique que les caractère '0' à '9' se suivent et sont bien dans l'ordre croissant.
On pourrait tester la présence d'un signe ('+' ou '-') en début de chaîne et la présence d'une unique virgule (ou plutôt le point décimal '.') dans la chaîne pour les nombres flottants.
La fonction isdigit() le permet!!
la syntaxe: isdigit(nom de la chaine[position du caractère]); Renvoi 0 si le caractère n'est pas numérique.;)
quant à la fonction atoi() elle pemet de Convertir une chaine représentant une valeur numérique en (type int), mais ne vérifie pas si une chaîne de caractère présente un nombre.
il n'y a vraiment que 2 manières :
- soit passer à travers chaque caractère, et vérifier qu'il est un chiffre, ou +, ou -, ou .
- soit faire un sscanf ( chaine, "%f", &nombrefloat) et vérifier si le statut est égal à 1
oui c'est vrais, et ceci d'aprés les man pages de linux :
Citation:
The atoi() function converts the initial portion of the string pointed to by nptr to int. The behavior is the same as
strtol(nptr, (char **) NULL, 10);
except that atoi() does not detect errors.
The atol() and atoll() functions behave the same as atoi(), except that they convert the initial portion of the string to their return type of
long or long long. atoq() is an obsolete name for atoll().
Il faut savoir ce qu'on veut faire avec la chaine de caractere :
- s'assurer qu'elle n'est compose que de chiffres, mais on ne souhaite pas convertir vers un entier ou un reel. Dans ce cas, une boucle avec isdigit() est la meilleure solution;
- convertir la chaine de caractere en entier ou reel. Alors, strtol() et strtod() sont la solution (sscanf() dans une moindre mesure car elle ne retourne pas l'endroit ou la conversion a echoue, ce qui rend l'utilisation moins flexible - il y a des cas ou on sait que la conversion va echouer, genre "187abc" lorsqu'on veut convertir le premier chiffre puis se placer sur le 'a').
bon, juste pour rire, on peut faire :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char hihi[] = "12345", haha[100]; sprintf(haha,"%d",atoi(hihi)); if ( strcmp(haha,hihi) ) { printf("ce n'est pas un entier"); } else { printf("c'est bien un entier"); } return 0; }