68 votes

Pourquoi n'y a-t-il pas de strtoi dans stdlib.h ?

J'ai pris l'habitude de strtod et ses variantes. Je me demande pourquoi il n'y a pas strtoi livré avec <stdlib.h> . Comment se fait-il que le type entier soit exclu de cette fête ?

Plus précisément, je demande pourquoi il n'y a pas une version de atoi avec les caractéristiques de sécurité de strtod ?

49voto

Wiz Points 1281

strtol() convertit une chaîne de caractères en un nombre entier, un nombre entier long mais un nombre entier quand même. Il y a atoi() mais elle doit être évitée dans la plupart des cas, car elle ne dispose pas d'un mécanisme de signalement d'erreur en cas d'entrée invalide.

8 votes

Lorsque la gamme de long dépasse la gamme de int , strtol() ne fixe pas errno ni retour INT_MIN/MAX en int ne débordent qu'en annulant la valeur de ce dispositif de sécurité.

3 votes

@chux pas sûr de ce que vous essayez de dire. Bien sûr, il n'y a pas d'erreur si la valeur passée dépasse la plage des int.

7 votes

Comme la réponse ne détaille pas comment utiliser strtol() lorsqu'on essaie de convertir en un int en soulignant que les chaînes de caractères qui représentent une valeur en dehors de l'intervalle de confiance de l'utilisateur. int (mais pas long ) ne fixent pas errno ni obtenir une valeur limitée. Il s'agit d'un comportement différent de celui des chaînes de caractères qui représentent une valeur en dehors de l'intervalle des long gamme : qui fixe errno et bénéficiez d'une valeur limitée.

3voto

James McNellis Points 193607

L'entier n'est pas exclu de la fête : il y a strtol qui convertit une chaîne de caractères en un long qui est un type entier.

2voto

Marc K. Points 11

C'est ce que j'ai utilisé.

long long_val;
int  int_value;

errno = 0;
long_val = strtol (theString, NULL, 10);
if (errno)
   handle_error;
if ((long) someIntMin > long_val || long_val > (long) someIntMax)
   handle_invalid;
int_value = (int) long_val;

0 votes

Curieux, pourquoi les moulages à (long) . Ayez l'air inutile.

-4voto

sarnold Points 62720

Ne négligez pas les SEE ALSO de vos pages de manuel :)

SEE ALSO
       atof(3), atoi(3), atol(3), strtol(3), strtoul(3)

Vous êtes à la recherche de atoi(3) . :)

2 votes

En fait, je ne le suis pas. Désolé, je vais clarifier ma question.

0 votes

Bon, je sais que c'est vieux, mais strto[u]l(3) est mentionné dans cette SEE ALSO !

-4voto

mtrw Points 10098

C'est un appel atoi . Voir aussi Wikipedia pour plus de détails, y compris son successeur strol .

8 votes

atoi ne doit pas être utilisé.

3 votes

@James McNellis atoi ne doit pas être utilisé -- vous avez fait cette déclaration comme si votre raison devait être évidente, mais comme plusieurs réponses semblent toutes convenir que atoi() est la bonne solution, cela ne doit pas être si évident. Voulez-vous expliquer à tout le monde pourquoi vous pensez que atoi ne devrait pas être utilisé ou vaut-il mieux laisser le mystère ?

1 votes

@mah : Si atoi renvoie à 0 , INT_MIN ou INT_MAX vous n'avez aucun moyen de savoir si la conversion a réussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X