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.
char *
, vous devez donc passer dans un tableau de caractères de taille normale et tout fonctionnera correctement. 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.