Conversion de int en chaîne en C

J’utilise la fonction itoa() pour convertir un int en ssortingng , mais cela donne une erreur:

 undefined reference to `itoa' collect2: ld returned 1 exit status 

Quelle est la raison? Existe-t-il un autre moyen d’effectuer cette conversion?

Utilisez snprintf , il est plus portable que itoa .

itoa ne fait pas partie de la norme C ni de la norme C ++ ; mais de nombreux compilateurs et bibliothèques associées le supportent.

Exemple de sprintf

 char* buffer = ... allocate a buffer ... int value = 4564; sprintf(buffer, "%d", value); 

Exemple de snprintf

 char buffer[10]; int value = 234452; snprintf(buffer, 10, "%d", value); 

Les deux fonctions sont similaires à fprintf , mais la sortie est écrite dans un tableau plutôt que dans un stream. La différence entre snprintf et snprintf est que snprintf garantit l’absence de snprintf mémoire tampon en écrivant jusqu’à un nombre maximal de caractères pouvant être stockés dans la buffer .

Avant de continuer, je dois vous avertir itoa PAS une fonction ANSI – ce n’est pas une fonction standard. Vous devez utiliser sprintf pour convertir un int en chaîne.

itoa prend trois arguments.

  • Le premier est l’entier à convertir.
  • La seconde est un pointeur sur un tableau de caractères – c’est ici que la chaîne va être stockée. Le programme peut planter si vous transmettez une variable char * , vous devez donc passer dans un tableau de caractères de taille normale et tout fonctionnera correctement.
  • La dernière ne correspond PAS à la taille du tableau, mais à la BASE de votre nombre – la base 10 est celle que vous utiliserez le plus.

La fonction renvoie un pointeur sur son deuxième argument – où elle a stocké la chaîne convertie.

itoa est une fonction très utile, supscope par certains compilateurs – dommage que ce ne soit pas supporté par tous, contrairement à atoi .

Si vous voulez toujours utiliser itoa , voici comment l’utiliser. Sinon, vous avez une autre option en utilisant sprintf (tant que vous voulez une sortie en base 8, 10 ou 16):

 char str[5]; printf("15 in binary is %s\n", itoa(15, str, 2)); 

Mieux utiliser sprintf (),

 char ssortingngNum[20]; int num=100; sprintf(ssortingngNum,"%d",num); 

Utilisez snprintf – il est standard et disponible dans tous les compilateurs. Interrogez-le sur la taille requirejse en l’appelant avec les parameters NULL, 0 . Atsortingbuez un caractère de plus pour null à la fin.

 int length = snprintf( NULL, 0, "%d", x ); char* str = malloc( length + 1 ); snprintf( str, length + 1, "%d", x ); ... free(str); 

En général, snprintf() est la voie à suivre:

 char str[16]; // could be less but i'm too lazy to look for the actual the max length of an integer snprintf(str, sizeof(str), "%d", your_integer); 

Vous pouvez créer votre propre itoa , avec cette fonction:

 void my_utoa(int dataIn, char* bffr, int radix){ int temp_dataIn; temp_dataIn = dataIn; int ssortingngLen=1; while ((int)temp_dataIn/radix != 0){ temp_dataIn = (int)temp_dataIn/radix; ssortingngLen++; } //printf("ssortingngLen = %d\n", ssortingngLen); temp_dataIn = dataIn; do{ *(bffr+ssortingngLen-1) = (temp_dataIn%radix)+'0'; temp_dataIn = (int) temp_dataIn / radix; }while(ssortingngLen--);} 

et c’est exemple:

 char buffer[33]; int main(){ my_utoa(54321, buffer, 10); printf(buffer); printf("\n"); my_utoa(13579, buffer, 10); printf(buffer); printf("\n"); } 
 char ssortingng[something]; sprintf(ssortingng, "%d", 42); 
 void itos(int value, char* str, size_t size) { snprintf(str, size, "%d", value); } 

..travail avec appel par référence . Utilisez-le comme ceci, par exemple:

 int someIntToParse; char resultingSsortingng[length(someIntToParse)]; itos(someIntToParse, resultingSsortingng, length(someIntToParse)); 

resultatingSsortingng tiendra maintenant votre C-‘chaîne’.

Implémentation similaire à Ahmad Sirojuddin mais avec une sémantique légèrement différente. Du sharepoint vue de la sécurité, chaque fois qu’une fonction écrit dans un tampon de chaîne, la fonction doit réellement “connaître” la taille du tampon et refuser d’écrire après la fin de celui-ci. Je suppose que c’est une partie de la raison pour laquelle vous ne trouvez plus itoa.

En outre, la mise en œuvre suivante évite d’effectuer deux fois l’opération module / devide.

 char *u32todec( uint32_t value, char *buf, int size) { if(size > 1){ int i=size-1, offset, bytes; buf[i--]='\0'; do{ buf[i--]=(value % 10)+'0'; value = value/10; }while((value > 0) && (i>=0)); offset=i+1; if(offset > 0){ bytes=size-i-1; for(i=0;i 

Le code suivant teste le code ci-dessus et en démontre l'exactitude:

 int main(void) { uint64_t acc; uint32_t inc; char buf[16]; size_t bufsize; for(acc=0, inc=7; acc<0x100000000; acc+=inc){ printf("%u: ", (uint32_t)acc); for(bufsize=17; bufsize>0; bufsize/=2){ if(NULL != u32todec((uint32_t)acc, buf, bufsize)) printf("%s ", buf); } printf("\n"); if(acc/inc > 9) inc*=7; } return 0; } 

Comme suggéré par Edwin, utilisez snprintf :

 #include  int main(int argc, const char *argv[]) { int n = 1234; char buf[10]; snprintf(buf, 10, "%d", n); printf("%s\n", buf); return 0; } 

Si vous voulez vraiment utiliser itoa, vous devez inclure l’en-tête de la bibliothèque standard.

 #include  

Je crois aussi que si vous utilisez Windows (avec MSVC), alors itoa est en réalité _itoa .

Voir http://msdn.microsoft.com/en-us/library/yakksftt(v=VS.100).aspx

collect2 encore, puisque vous recevez un message de collect2 , vous utilisez probablement GCC sur * nix.

voir cet exemple

 #include  // for itoa() call #include  int main() { int num = 145; char buf[5]; // convert 123 to ssortingng [buf] itoa(num, buf, 10); // print our ssortingng printf("%s\n", buf); return 0; } 

voir ce lien avec d’autres exemples.