Quelle est la différence entre _itoa et itoa?
-
22-09-2019 - |
Question
Visual Studio me crie sur l'utilisation de itoa()
dire utiliser à la place _itoa()
?
Il me semble que ce sont les mêmes fonctions. Ce qui donne?
La solution
Une série C implémentation de la bibliothèque de temps n'est pas censé introduire des noms qui ne sont pas dans la norme, à moins qu'ils suivent une certaine convention de nommage (comme en commençant par un trait de soulignement). Les versions antérieures du compilateur Microsoft n'a pas suivi cette règle particulièrement près, mais au fil du temps, Microsoft a parcouru un chemin plus vers rendre leur application plus conforme aux normes. Ainsi, les fonctions qu'ils ont utilisé pour fournir ce empiéterait sur l'espace de noms de l'utilisateur qu'ils ont mis en œuvre en utilisant des noms qui sont réservés pour les implémentations du compilateur et ont été dévalorisant les anciens noms.
Si _CRT_NONSTDC_NO_WARNINGS
est défini, le compilateur MS ne se plaindra pas de la fonction itoa()
désapprouvée. Mais il se plaindra encore à ce sujet étant dangereux (vous devez définir _CRT_SECURE_NO_WARNINGS
pour calmer cet avertissement). Ou utiliser la version plus sûre de la fonction (_itoa_s()
) qui fournit la fonction de la taille de la mémoire tampon de destination
Les deux _itoa()
et la détermination de itoa()
à la même fonction exacte dans la bibliothèque vers le bas à la même adresse - il n'y a pas de différence, sauf dans le nom
Autres conseils
Le documentation MSDN pour itoa()
dit:
Cette fonction POSIX est début dépréciée dans Visual C ++ 2005. Utilisez le ISO C ++ ou
_itoa
_itoa_s
conforme de sécurité renforcée à la place.
itoa est pas standard C
« Cette fonction n'est pas définie dans la norme ANSI-C et ne fait pas partie de C ++, mais est pris en charge par certains compilateurs. » - cplusplus.com
MSVS vous dit d'utiliser le _itoa pour vous dire que ce n'est pas standard C ++ et que vous devez le marquer en tant que tel. Je crois qu'il est là pour la compatibilité ascendante et que cette notation est pour la lisibilité et la distinction.
itoa
n'est pas standard, vous devez donc utiliser stringstream à la place.
vous aurez besoin #include <sstream>
un exemple de son utilisation serait:
int i = 5;
std::stringstream ss;
ss << i;
std:: cout << ss.str();
En réponse à la réponse de Bruce:
itoa
n'est pas standard, vous devez donc utiliser stringstream à la place.vous aurez besoin
#include <sstream>
un exemple de son utilisation serait:
int i = 5;
std::stringstream ss;
ss << i;
std:: cout << ss.str();
Vous pouvez également votre propre fonction de la place itoa()
par exemple:
const char* itoa (int num)
{
if (num == 0)
{
return "0";
}
bool neg = false;
if (num < 0)
{
neg = true;
num = -num;
}
int digits = 0;
int tmp = num;
while (tmp > 0)
{
digits++;
tmp /= 10;
}
int digs[digits];
for (tmp = digits; num > 0; tmp--)
{
digs[tmp] = num % 10;
num /= 10;
}
string s = neg == true ? "-" : "";
for (tmp = 1; tmp <= digits; tmp++)
{
s += (char)(digs[tmp] + 48);
}
return s.c_str();
}