This should do it. It converts the string to floating point using strtod and checks to see if there is any more input after it.
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;
}
To distinguish between float
s and int
s is trickier. A regex is one way to go, but we could just check for floating chars:
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
}
Of course, a more streamlined way to do this is to return the type of the value and the value together.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…