Détecter si une chaîne est un double ou un long en C

Je traite avec un caractère [] contenant du texte qui devrait représenter une valeur de nombre double OU un nombre long.
J’ai besoin d’écrire une fonction qui détecte lequel des types de données ci-dessus est représenté (le cas échéant).

J’ai pensé à utiliser strtol () et vérifier s’il échouait à parsingr la chaîne entière et s’il échouait, en utilisant strtod ()

Je serais heureux de voir s’il existe une meilleure option pour le faire. Merci.

J’ai pensé à utiliser strtol () et vérifier s’il échouait à parsingr la chaîne entière et, le cas échéant, à l’aide de strtod ().

Je pense que c’est une bonne idée et je ne pense pas qu’il y en ait une meilleure. Implémenter votre propre routine d’parsing est généralement une mauvaise idée.

Je voudrais couper la chaîne de la fin des espaces avant d’appeler strtol pour éviter les faux négatifs.

strtol() et strtod() est la bonne approche. Assurez-vous d’utiliser errno pour détecter le dépassement d’entier. 2 fonctions autonomes suivent:

 int Is_long(const char *src, long *dest) { char *endptr; // Clear, so it may be tested after strtol(). errno = 0; // Using 0 here allows 0x1234, octal 0123 and decimal 1234. long num = strtol(src, &endptr, 0); // If +/- overflow, "" or has trailing text ... if (errno || endptr == src || *endptr != '\0') { return 0; } if (dest) *dest = num; return 1; } int Is_double(const char *src, double *dest) { char *endptr; // In this case, detecting over/undeflow IMO is not a concern, so ignore it. double num = strtod(src, &endptr); // If "" or has trailing text ... if (endptr == src || *endptr != '\0') { return 0; } if (dest) *dest = num; return 1; } 

@Klas Lindbäck fait ressortir le bon point en ce qui concerne la suppression de l’espace blanc. Cette réponse suppose que ce n’est pas valide.

  You can use the following code to detect that. char* isDouble = strchr(ssortingng, '.'); if (isDouble) { // is Double here }else { // is long here }