2009-10-19 7 views

Répondre

19

mise en œuvre de la bibliothèque de l'exécution AC n'est pas censé introduire des noms qui ne sont pas dans la norme à moins qu'ils suivent une certaine convention de nommage (par exemple en commençant par un trait de soulignement). Les versions antérieures du compilateur de Microsoft ne suivaient pas cette règle particulièrement, mais au fil du temps, Microsoft s'est orienté davantage vers la mise en conformité de ses implémentations. Ainsi, les fonctions qu'elles fournissaient pour s'introduire dans l'espace de noms de l'utilisateur qu'elles implémen- taient en utilisant des noms réservés aux implémentations du compilateur et qui dépréciaient les anciens noms.

Si _CRT_NONSTDC_NO_WARNINGS est défini, le compilateur MS ne se plaindra pas de la fonction itoa() qui est dépréciée. Mais il se plaindra encore d'être 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 itoa() détermination à exactement la même fonction dans la bibliothèque vers le bas à la même adresse - il n'y a pas de différence, sauf dans le prénom.

8

Le MSDN documentation for itoa() dit:

Cette fonction est POSIX début dépréciée dans Visual C++ 2005. Utilisez le ISO C++ ou de sécurité _itoa conforme améliorée _itoa_s à la place.

+0

Est-il juste les noms qui sont différents alors ?? – Polaris878

+0

cette réponse n'indique pas si _itoa et itoa ont la même fonction ... –

5

itoa est pas standard C.

"Cette fonction n'a pas été défini dans la norme ANSI-C et ne fait pas partie de C++, mais est soutenu par certains compilateurs." Par conséquent, MSVS vous demande d'utiliser _itoa pour vous indiquer qu'il ne s'agit pas d'un C++ standard et que vous devez le marquer comme tel. Je crois qu'il est là pour la rétrocompatibilité et que cette notation est pour la lisibilité et la distinction.

4

itoa n'est pas standard, vous devriez 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(); 
+0

Je ne trouve pas pourquoi nous devons utiliser un flux ayant _itoa() ou _itoa_s(). Je pense que deux alternatives sont un meilleur choix que la création d'un flux pour convertir seulement un nombre en chaîne. – HyLian

+1

itoa n'est pas standard, vous pouvez toujours l'utiliser. Assurez-vous simplement que le compilateur que vous utilisez le supporte. une stringstream est juste la bonne façon de le faire. – Corey

+0

Non, c'est la manière C++ de le faire, et être C++ ne veut pas dire que c'est correct. –

1

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 itoa() au lieu

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(); 
} 
Questions connexes