172 votes

Où se trouve la fonction itoa dans Linux ?

itoa() est une fonction très pratique pour convertir un nombre en chaîne de caractères. Linux ne semble pas avoir itoa() existe-t-il une fonction équivalente ou dois-je utiliser la fonction sprintf(str, "%d", num) ?

4 votes

Toute raison de ne pas utiliser sprintf(str, "%d", num) ? est-il beaucoup plus lent que itoa ?

5 votes

@javapowered, pour commencer, itoa permet une conversion arbitraire des bases, printf les spécificateurs ne le font pas.

0 votes

@javapowered sprintf() n'est pas sûr du signal

127voto

Matt J Points 15475

EDIT : Désolé, j'aurais dû me rappeler que cette machine est décidément non standard, et que j'ai branché plusieurs appareils non standard. libc mises en œuvre à des fins académiques ;-)

Comme itoa() n'est en effet pas standard, comme l'ont mentionné plusieurs commentateurs utiles, il est préférable d'utiliser l'option sprintf(target_string,"%d",source_int) ou (mieux encore, parce qu'il est à l'abri des débordements de mémoire tampon) snprintf(target_string, size_of_target_string_in_bytes, "%d", source_int) . Je sais que ce n'est pas aussi concis ou cool que itoa() mais au moins vous pouvez écrire une fois, courir partout (tm) ;-)

Voici l'ancienne réponse (modifiée)

Vous avez raison de dire que le défaut gcc libc ne comprend pas itoa() comme plusieurs autres plateformes, car il ne fait pas techniquement partie de la norme. Voir ici pour un peu plus d'informations. Notez que vous devez

#include <stdlib.h>

Bien sûr, vous le savez déjà, parce que vous vouliez utiliser itoa() sous Linux après l'avoir vraisemblablement utilisé sur une autre plateforme, mais... le code (volé du lien ci-dessus) ressemblerait à ceci :

Exemple

/* itoa example */
#include <stdio.h>
#include <stdlib.h>

int main ()
{
  int i;
  char buffer [33];
  printf ("Enter a number: ");
  scanf ("%d",&i);
  itoa (i,buffer,10);
  printf ("decimal: %s\n",buffer);
  itoa (i,buffer,16);
  printf ("hexadecimal: %s\n",buffer);
  itoa (i,buffer,2);
  printf ("binary: %s\n",buffer);
  return 0;
}

Sortie :

Enter a number: 1750
decimal: 1750
hexadecimal: 6d6
binary: 11011010110

J'espère que cela vous aidera !

2 votes

Hmmm, compiler cela sur Debian me donne "undefined reference to `itoa'". Peut-être que quelque chose ne va pas avec mon système.

0 votes

J'obtiens la même chose sur Ubuntu 8.04. Je ne trouve aucune référence à itoa dans stdio.h ou stdlib.h non plus (ce qui n'est pas surprenant puisqu'il ne fait pas partie de la norme).

0 votes

Édité pour être correct, merci les gars ! désolé, j'oublie toujours que ce n'est pas une boîte Linux vanille ;-)

30voto

haccks Points 33022

itoa n'est pas une fonction C standard. Vous pouvez implémenter la vôtre. Elle est apparue dans la première édition de Kernighan y Ritchie's Le langage de programmation C à la page 60. La deuxième édition du langage de programmation C ("K&R2") contient l'implémentation suivante de itoa à la page 64. Le livre note plusieurs problèmes avec cette implémentation, notamment le fait que il ne gère pas correctement le nombre le plus négatif

 /* itoa:  convert n to characters in s */
 void itoa(int n, char s[])
 {
     int i, sign;

     if ((sign = n) < 0)  /* record sign */
         n = -n;          /* make n positive */
     i = 0;
     do {       /* generate digits in reverse order */
         s[i++] = n % 10 + '0';   /* get next digit */
     } while ((n /= 10) > 0);     /* delete it */
     if (sign < 0)
         s[i++] = '-';
     s[i] = '\0';
     reverse(s);
}  

La fonction reverse utilisé ci-dessus est mis en œuvre deux pages plus tôt :

 #include <string.h>

 /* reverse:  reverse string s in place */
 void reverse(char s[])
 {
     int i, j;
     char c;

     for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
}

12voto

James Antill Points 1676

Si vous l'appelez souvent, le conseil "utilisez simplement snprintf" peut être ennuyeux. Voici donc ce que vous voulez probablement :

const char *my_itoa_buf(char *buf, size_t len, int num)
{
  static char loc_buf[sizeof(int) * CHAR_BITS]; /* not thread safe */

  if (!buf)
  {
    buf = loc_buf;
    len = sizeof(loc_buf);
  }

  if (snprintf(buf, len, "%d", num) == -1)
    return ""; /* or whatever */

  return buf;
}

const char *my_itoa(int num)
{ return my_itoa_buf(NULL, 0, num); }

19 votes

Ce n'est pas seulement non threadé, ce n'est pas très sûr du tout :- void some_func(char* a, char* b) ; some_func(itoa(123), itoa(456)) ; Devinez ce que la fonction reçoit ?

0 votes

Aussi, const les qualificatifs ne font rien sur les types de retour des fonctions -- vous le sauriez si vous activiez les avertissements du compilateur :)

9 votes

@cat Mais il n'y a pas de type de retour qualifié de const ici. const char * est un pointeur non-const vers const, ce qui a beaucoup de sens et est correct.

9voto

Mark Ransom Points 132545

Edit : Je viens de découvrir std::to_string dont le fonctionnement est identique à celui de ma propre fonction ci-dessous. Elle a été introduite dans C++11 et est disponible dans les versions récentes de gcc, au moins dès la 4.5 si vous activez les extensions c++0x.


Non seulement itoa manquant dans gcc, ce n'est pas la fonction la plus pratique à utiliser puisque vous devez lui fournir un tampon. J'avais besoin de quelque chose qui puisse être utilisé dans une expression, alors j'ai trouvé ceci :

std::string itos(int n)
{
   const int max_size = std::numeric_limits<int>::digits10 + 1 /*sign*/ + 1 /*0-terminator*/;
   char buffer[max_size] = {0};
   sprintf(buffer, "%d", n);
   return std::string(buffer);
}

D'ordinaire, il serait plus sûr d'utiliser snprintf au lieu de sprintf mais le tampon est soigneusement dimensionné pour être immunisé contre les dépassements.

Voir un exemple : http://ideone.com/mKmZVE

28 votes

La question semble porter sur C, qui n'a pas de std:: etc.

6voto

Comme l'a écrit Matt J, il y a itoa mais ce n'est pas la norme. Votre code sera plus portable si vous utilisez snprintf .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X