atoi est une fonction standard. Mais itoa n’est pas. Pourquoi?

Pourquoi cette distinction? J’ai rencontré de terribles problèmes, supposant que itoa était dans stdlib.h et que stdlib.h finissais par relier une version personnalisée d’ itoa à un prototype différent et ainsi produire des erreurs folles.

Alors, pourquoi n’est- itoa pas une fonction standard? Qu’est ce qui ne va pas avec ça? Et pourquoi la norme est-elle partielle envers son frère jumeau atoi ?

Aucune itoa jamais été standardisée, vous devez disposer d’une raison convaincante et d’une bonne interface pour l’append à la norme.

La plupart des interfaces que j’ai vues utilisent un tampon statique qui pose des problèmes de ré-entrée et de durée de vie, alloue un tampon dynamic que l’appelant doit libérer ou demande à l’utilisateur de fournir un tampon qui rend l’interface meilleure que sprintf .

Une fonction “itoa” devrait renvoyer une chaîne. Puisque les chaînes ne sont pas des objects de première classe, l’appelant devrait passer un tampon + longueur et la fonction devrait avoir un moyen d’indiquer si elle manquait de place ou non. Au moment où vous en êtes, vous avez créé quelque chose d’assez similaire pour qu’il ne soit pas utile de dupliquer le code / les fonctionnalités. La fonction “atoi” existe parce qu’elle est moins compliquée (et sans doute plus sûre) qu’un appel “scanf” complet. Une fonction “itoa” ne serait pas assez différente pour en valoir la peine.

La fonction itoa n’est pas standard probablement parce que sa définition n’est pas cohérente. Différents fournisseurs de compilateurs et de bibliothèques ont introduit des versions atoi de celui-ci, éventuellement comme une invention destinée à compléter atoi .

Si une fonction non standard est largement fournie par les fournisseurs, le travail de la norme consiste à la codifier : ajoutez en gros une description de la fonction existante à la norme. Cela est possible si la fonction a des conventions d’arguments et un comportement plus ou moins cohérents.

Comme plusieurs itoa d’ itoa sont déjà disponibles, une telle fonction ne peut pas être ajoutée à ISO C. Quel que soit le comportement décrit, certaines implémentations seraient en contradiction avec le comportement décrit.

itoa a existé sous des formes telles que:

 void itoa(int n, char *s); /* Given in _The C Programming Language_, 1st ed. (K&R1) */ void itoa(int input, void (*subr)(char)); /* Ancient Unix library */ void itoa(int n, char *buf, int radix); char *itoa(int in, char *buf, int radix); 

Microsoft la fournit dans leur bibliothèque d’ _itoa Visual C sous le nom modifié: _itoa .

Non seulement les implémentations C l’ont-elles historiquement fournie sous des définitions différentes, mais les programmes C fournissent également une fonction appelée itoa function pour eux-mêmes, qui est une autre source possible de conflits.

Fondamentalement, l’identifiant itoa est “radioactif” en ce qui concerne la normalisation en tant que nom externe ou macro. Si une telle fonction est normalisée, elle devra être sous un nom différent.