10
votes

Quelle est la différence entre _itoa et itoa?

Visual Studio vous crie à l'aide de ITOA () Dire d'utiliser _itoa () à la place?

Cela me semble comme si elles sont la même fonction. Ce qui donne?


0 commentaires

5 Réponses :


8
votes

the Documentation MSDN pour ITOA () < / code> dit:

Cette fonction POSIX est obsolète à partir de Visual C ++ 2005. Utilisez l'ISO C ++ conformiste _ITOA ou Security-amélioré _itoa_s .


2 commentaires

Est-ce juste les noms qui sont différents alors ??


Cette réponse ne traite pas de savoir si _itoa et ITOA sont la même fonction ...



5
votes

ITOA n'est pas standard C.

"Cette fonction n'est pas définie dans ANSI-C et ne fait pas partie de C ++, mais est pris en charge par certains compilateurs." - Cplusplus.com

Donc, MSVS vous indique d'utiliser le _ITOA pour vous dire qu'il n'est pas standard C ++ et que vous devriez le marquer comme tel. Je crois que c'est là pour la compatibilité à l'envers et que cette notation est destinée à la lisibilité et à la distinction.


0 commentaires

4
votes

itoa n'est pas standard, vous devez donc utiliser StringStream à la place.

Vous aurez besoin #include

de son utilisation serait: xxx


3 commentaires

Je ne trouve pas pourquoi nous devons utiliser un ruisseau ayant _itoa () ou _itoa_s (). Je pense que deux alternatives sont un meilleur choix qui créant un flux pour convertir uniquement un numéro en chaîne.


ITOA n'est pas standard, vous pouvez toujours l'utiliser. Assurez-vous simplement que le compilateur que vous utilisez le soutient. Un stringream est juste la bonne façon de le faire.


Non, c'est la façon C ++ de le faire et être C ++ ne signifie pas que c'est vrai.



23
votes

Une mise en œuvre de la bibliothèque de temps d'exécution C n'est pas censée introduire des noms qui ne sont pas dans la norme, à moins qu'ils ne suivent une certaine convention de dénomination (comme à partir d'un soulignement). Les versions antérieures du compilateur de Microsoft n'ont pas suivi cette règle de manière particulièrement étroitement, mais au fil du temps, Microsoft a plus de choses pour rendre leur mise en œuvre plus conforme aux normes. Donc, les fonctions qu'ils utilisaient pour fournir intrus sur l'espace de noms de l'utilisateur qu'ils ont mises en œuvre à l'aide de noms réservés aux implémentations du compilateur et ont amorcé les anciens noms.

Si _crt_nonstdc_no_warnings est défini, le compilateur MS ne se plaint pas de la fonction itoa () est obsolète. Mais il restera encore en train de se plaindre d'être dangereux (vous devez définir _crt_secure_no_warnings pour calmer cet avertissement). Ou utilisez la version plus sûre de la fonction ( _itoa_s () ) qui fournit la fonction avec la taille de la mémoire tampon de destination

Les deux _itoa () et itoa () résolve à la même fonction exacte de la bibliothèque vers la même adresse - il n'y a pas de différence sauf dans le nom. < / p>


0 commentaires

1
votes

en réponse à la réponse de Bruce:

itoa n'est pas standard, vous devez donc utiliser StringStream à la place.

Vous aurez besoin #include

Un exemple de son utilisation serait:

int i = 5; std :: stringstream ss;

ss << i;

std :: cou << ss.str ();

Vous pouvez également coder votre propre itoa () fonction à la place

xxx


1 commentaires

Cette fonction est inefficace, non portable et gaspillée: l'appelant ne peut pas supprimer correctement la mémoire allouée à la chaîne car le pointeur renvoyé pourrait également indiquer une chaîne littéral. C ++ n'est pas Java.