Fonction permettant de vérifier si la chaîne d’entrée est un nombre entier ou un nombre à virgule flottante?

Y at-il une fonction en C pour vérifier si l’entrée est un int , long int ou float ? Je sais que C a une fonction isdigit() et je peux créer une fonction isnumeric comme suit:

 int isnumeric( char *str ) { while(*str){ if(!isdigit(*str)) return 0; str++; } return 1; } 

Mais je me demandais comment créer une fonction qui prendrait un nombre à virgule flottante (sous forme de chaîne) et produirait une valeur TRUE / FALSE.

Cela devrait le faire. Il convertit la chaîne en virgule flottante à l’aide de strtod et vérifie s’il y a d’autres entrées après.

 int isfloat (const char *s) { char *ep = NULL; double f = strtod (s, &ep); if (!ep || *ep) return false; // has non-floating digits after number, if any return true; } 

Faire la distinction entre float s et int s est plus délicat. Un regex est une solution, mais nous pourrions simplement vérifier les caractères flottants:

 int isfloat (const char *s) { char *ep = NULL; long i = strtol (s, &ep); if (!*ep) return false; // it's an int if (*ep == 'e' || *ep == 'E' || *ep == '.') return true; return false; // it not a float, but there's more stuff after it } 

Bien sûr, une façon plus simple de procéder consiste à renvoyer le type de la valeur et la valeur ensemble.

 int isnumeric( char *str ) { double d; return sscanf(str, "%lf", &d); } 

Si votre objective est de trouver le type de données qu’une chaîne donnée peut contenir, vous pouvez faire quelque chose comme ceci:

 #include  #include  #include  #include  #include  #include  /* If a floating-point number is +/- F_EPS from an integer, consider it to be an integer */ #define F_EPS 1e-7 enum datatype { TYPE_INT, TYPE_LONG, TYPE_FLOAT, TYPE_DOUBLE, TYPE_INVALID }; enum datatype findtype(const char *s) { char *eptr; double d; double diff; errno = 0; d = strtod(s, &eptr); if ((d == 0 && eptr == s) || errno == ERANGE) return TYPE_INVALID; diff = d - floor(d+0.5); if (d <= INT_MAX && d >= INT_MIN && diff <= F_EPS) return TYPE_INT; if (d <= LONG_MAX && d >= LONG_MIN && diff <= F_EPS) return TYPE_LONG; if ((d > 0 && (d > FLT_MAX || d < FLT_MIN)) || (d < 0 && (d < -FLT_MAX || d > -FLT_MIN))) return TYPE_FLOAT; return TYPE_DOUBLE; } 

L’idée est que vous lisiez le nombre comme un double , puis que vous vérifiiez s’il se trouvait dans la plage des différents types. Vous pouvez modifier F_EPS ci-dessus pour contrôler la tolérance.