10
votes

Atoi () - String to int

j'ai lu que atoi () code> est obsolète et qu'il est équivalent à:

(int)strtol(token_start, (char **)NULL, 10);

c

2 commentaires

Mon problème avec atoi : assert (aoii ("0")! = Atoi (! Bla "))


Atoi est faible car il ne fait presque pas de détection d'erreur bien définie, mais même lorsque vous utilisez strtol , détecter correctement les erreurs de détection (et de classification) est étonnamment difficile et aucune des réponses ici traite vraiment de cela. Voir les réponses à Cette question Pour certaines directives.


5 Réponses :


-3
votes

Cela signifie que, à un moment donné, Atoi ne sera plus disponible. Alors commencez à changer votre code maintenant


2 commentaires

Je reçois cette partie, mais je me demandais si la mise en œuvre d'ATOI vient d'appeler le code ci-dessus.


Ceci est incorrect, la citation nécessaire. Rien dans la norme C actuelle ne indique qu'Ooi est obsolète. Et ceci est 6 ans après que cette réponse a été faite, le C11 étant la norme active.



8
votes

Il dit que sur Apple's Page manuelle Mac OS X pour ATOI (3) (et dans les pages de l'homme BSD aussi) que ATOI code> a été obsolète.

La fonction ATOI () a été obsolète par strtol () et ne devrait pas être utilisé dans le nouveau code. P> blockquote>

J'utiliserais le strtol () code> équivalent pour cette raison, mais je doute que vous ayez à vous inquiéter de ATOI () code> être supprimé. p>

de http://www.codecogs.com/library/computing /c/stdlib.h/atoI.php Notes de mise en œuvre Strike> P>

* The atoi function is not thread-safe and also not async-cancel safe.
* The atoi function has been deprecated by strtol and should not be used in new code.


6 commentaires

Cela ne dépend-il que sur la mise en œuvre interne du atoi s'il s'agit de la sécurité du thread ou non? Sinon, qu'est-ce qui ne le rend pas thread-coffre-fort à l'extérieur?


Ils ont dû essayer très fort de le faire sans fil. La mise en œuvre naïve est sûre.


Il est important de noter que tous les compilateurs ne supporte pas encore les fonctions STO *, comme Android NDK. Voir cette question pour plus: Stackoverflow.com/Questtions/15499070/...


La page Homme Glibc pour Atoi dit: "Les fonctions ATOI (), ATOL () et ATOLL () sont du thread-Safe avec des exceptions. Ces fonctions peuvent être utilisées en toute sécurité dans des applications multithreadées, tant que SetLocale (3) n'est pas appelée changer les paramètres régionaux lors de leur exécution. "


Cette réponse, ou plutôt la source, est incorrecte / non pertinente. Qu'il s'agisse d'une certaine fonction ou non du thread-Safe dépend effectivement de la mise en œuvre du compilateur. Je ne vois pas pourquoi ce ne serait pas. Atoi n'est pas différente des fonctions Strol à cet égard. Plus d'informations, Atoi n'est certainement pas obsolète. Ce n'était pas en 2009 et ce n'est pas non plus non plus, dans la norme C11.


@LUNDIN Je ne peux pas supprimer cette réponse car c'est l'accepté, donc je l'ai mis à jour. J'ai constaté que les pages du BSD et OSX Man disent que cela est obsolète, même si je ne sais pas quelle est la question initiale.



4
votes

3 commentaires

J'ai essayé votre code sur mon compilateur (GCC) et m'a tous deux donné 0 , donc je ne vois aucune différence: |


Hmmm, mon mauvais! Merci @sasq. Je pensais strtol a dû définir errno sur erreur, mais dans le cas spécifique de mon code de test ci-dessus, il ne le fait pas.


@PMG Votre code de test ne semble pas vérifier errno du tout.



3
votes

Non, vous ne devriez pas utiliser ce qui précède au lieu de atoi .

Vous devez réellement vérifier les informations d'erreur que strtol est disponible: < Pré> xxx

doit être remplacé par xxx


0 commentaires

19
votes

ATOI n'est pas obsolète, votre source est incorrecte. Rien dans la norme C actuelle ISO 9899: 2011 indique ceci (voir par exemple le chapitre 6.11 Directions de langue futures), ni quoi que ce soit dans des normes antérieures.

Selon la norme C, ATOI équivaut à Strtol comme suit, C11 7.22.1.2:

Les fonctions ATOI, ATOL et ATOLL convertissent la partie initiale de la Chaîne pointée par NPTR à Int, longue int et longue long int Représentation, respectivement.

Sauf pour le comportement sur l'erreur, ils sont équivalents à

ATOI: (int) strtol (NPTR, (Char **) NULL, 10)

atol: strtol (NPTR, (char * **) null, 10)

ATOLL: STOLL (NPTR (**) NULL, 10)

strtol est préférable, car Atoi invoque un comportement indéfini lors de l'erreur. Voir 7.22.1 "Si la valeur du résultat ne peut pas être représentée, le le comportement est indéfini. "


3 commentaires

(Oui, je sais que cette question est terriblement ancienne mais la réponse acceptée est incorrecte, devait être clarifiée)


"Si la valeur du résultat ne peut pas être représentée, le comportement est indéfini". Cela rendait sûrement la fonction complètement inutilisable et constitue une raison suffisante de considérer la fonction efficacement obsolète.


@Williampursell en effet. Donnez au comité standard C quelques décennies de plus et ils pourraient se rendre compte. Par exemple, il leur a fallu 22 ans pour supprimer obtient . L'inculpation même de l'efficacité et de l'initiative. Comparez ceci avec la norme de sous-ensemble Safe-C MISRA-C, qui a interdit toutes les fonctions de l'ATO * dès 1998.