J'utilise la fonction StrtOD () pour extraire une variable d'environnement en tant que chaîne, puis la modifiant pour doubler à l'aide de StrTOD:
enter code here char strEnv[32]; strncpy(strEnv, getenv("LT_LEAK_START"), 31); // How to make sure before parsing that env LT_LEAK_START is indeed a number? double d = strtod(strEnv, NULL);
6 Réponses :
Ce second argument à strtod code>, que vous avez défini sur
null code> peut être un pointeur à pointer-ponter-to-caractère; Le pointeur-à-char qui indique qu'il sera configuré sur le caractère après la dernière chose
strtod code> géré à analyser. Si c'est la fin de la corde, ou du moins, il n'y a rien de côté qu'après cela, mais avec espace, alors ce que vous aviez été un nombre. Sinon, c'était autre chose. P>
Le 2e argument de la fonction Edition: Exemples ajoutés P> Le strtod code> est utile.
Strtod code> fonction essaie de convertir la partie initiale de la 1ère argument en un double et s'arrête soit lorsqu'il n'y a plus de caractères, ni un caractère qui ne peut pas être utilisé pour faire un double. P>
input result
---------- ----------------------------
"42foo" will return 42
and leave err pointing to the "foo" (*err == 'f')
" 4.5" will return 4.5
and leave err pointing to the empty string (*err == 0)
"42 " will return 42
and leave `err` pointing to the spaces (*err == ' ')
@PMG: Merci une tonne. Mais je ne suis pas exactement capable de comprendre, qu'est-ce que vous essayez exactement de faire par erreur?
@PMG: Donc, séparément, allons-nous vérifier tous les caractères spéciaux, etc., Isalpha, comme ça?
@PMG: Merci beaucoup pour les exemples. Alors pourquoi vérifier les espaces? Ne pouvons-nous pas vérifier directement pour (* err == 0) code>?
L'entrée "4 2" code> retournera 4 et laissez
foo code> pointant vers
"2" code>. Je pense que c'est un nombre non valide, il suffit de rechercher 1 espace dans * ERR ne suffit pas.
@PMG: Merci, votre est la meilleure explication. Beaucoup d'autres étaient également utiles.
@PMG Cependant, je ne suis toujours pas d'accord avec votre réponse. Si vous avez "foo", code> * err! = 0` et
Isspace ((non signé) * err) == true code>
@Ugo: vous êtes correct. Mon code ci-dessus est incomplet. Il ne valident pas correctement pour "FOO" ou "" (chaîne vide). Il ne s'agissait que d'un exemple d'utilisation de la 2e argument à strtod () code>.
Je ne sais pas grand chose à propos de cette langue, mais je sais que Strtod () retournera 0,0 si l'entrée est fausse. Peut-être que vous pourriez utiliser une expression régulière pour valider la chaîne d'entrée est un nombre. P>
homme strtod code>: Si aucune conversion n'est effectuée, zéro est renvoyé et la valeur de NPTR est stockée à l'emplacement référencé par ENDPTR.
char * endptr;
double d = strtod(strEnv, &endptr);
if (strEnv == endptr)
/* invalid number */
else
...
Vous n'avez pas fait de chèques pour des caractères spéciaux?
@ KingsMasher1 S'il y a un caractère spécial. Ce n'est pas un nombre valide de toute façon. Donc, la conversion échoue et endptr est réglée sur Strenv.
Votre réponse est trompeuse: il peut y avoir des cas où strenv! = Endptr code> et le numéro était valide, par exemple
"42" code> (espace à la fin)
@pgm En fait, vous avez toujours strenv! = endptr code> si le numéro est valide.
getenv code> - S'il s'agit de NULL, cette variable d'environnement n'existe pas. LI>
- Deuxièmement, si la valeur de retour de
getenv code> n'est pas null, vous avez la valeur, en tant que chaîne. li>
- troisième, ne définissez pas le paramètre
char * ** endptr code> de strtod code> à NULL, mais utilisez-le pour vérifier la validité de la valeur convertie, vérifiez également < Code> 0.0 code>. li>
ul>
Sûrement, vous pourriez faire pire que de simplement lire la page d'homme pour Strtod () et agir à ce sujet. Par exemple. Sur mon système Linux, il est indiqué:
RETURN VALUE These functions return the converted value, if any. If endptr is not NULL, a pointer to the character after the last character used in the conversion is stored in the location referenced by endptr. If no conversion is performed, zero is returned and the value of nptr is stored in the location referenced by endptr. If the correct value would cause overflow, plus or minus HUGE_VAL (HUGE_VALF, HUGE_VALL) is returned (according to the sign of the value), and ERANGE is stored in errno. If the correct value would cause underflow, zero is returned and ERANGE is stored in errno.
Cela ne vous dit pas tout ce que vous devez savoir du tout si vous voulez savoir si la chaîne est valide. Le retour de 0,0 sur erreur est fin, sauf si 0.0 est une valeur de point flottante valide!
@Jonathanwood: Bien sûr. Lisez la page de l'homme plus attentivement!
@Jonathanwood: Il existe de nombreux aspects de C et de la bibliothèque standard C qui peut être considérée comme imparfaite, mais cette fonction n'est pas particulièrement importante sur la liste. Quant à votre question, il est juste là dans la partie que j'ai cité: "Si aucune conversion n'est effectuée, zéro est renvoyé et la valeur de la NPTR est stockée à l'emplacement référencé par ENDPTR."
@Jonathanwood: quant à ce qu'est une "page homme", le premier moteur de recherche est "A href="htttps://fr.wikipedia.org/wiki/man_page" Rel="nofollow NOREFERRER "> EN.Wikipedia.org / wiki / man_page , ce qui l'explique bien. (Notez également que la question est marquée "Linux", de sorte que les systèmes non UNIX pourraient ne pas avoir que les pages de l'homme ne sont pas particulièrement pertinentes ici).
Vous faites simplement cela en essayant de le convertir en
double code>