39 votes

Convertir int en chaîne en C

Je utilise la fonction itoa() pour convertir un int en string, mais cela donne une erreur :

référence non définie vers `itoa'
collect2: ld a renvoyé 1 statut de sortie

Quelle est la raison? Y a-t-il un autre moyen de réaliser cette conversion?

89voto

Edwin Buck Points 33097

Utilisez snprintf, il est plus portable que itoa.

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

Exemple de sprintf

char* buffer = ... allouer un tampon ...
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 flux. La différence entre sprintf et snprintf est que snprintf garantit qu'aucun dépassement de tampon ne se produira en écrivant jusqu'à un nombre maximal de caractères pouvant être stockés dans le tampon.

8voto

Mirwise Khan Points 668

Avant de continuer, je dois vous avertir que itoa n'est PAS une fonction ANSI - ce n'est pas une fonction C standard. Vous devriez utiliser sprintf pour convertir un int en chaîne de caractères.

itoa prend trois arguments.

  • Le premier est l'entier à convertir.
  • Le deuxième est un pointeur vers un tableau de caractères - c'est là que la chaîne sera stockée. Le programme peut planter si vous passez une variable char *, donc vous devriez passer un tableau de caractères de taille normale et cela fonctionnera bien.
  • Le dernier n'est PAS la taille du tableau, mais c'est la BASE de votre nombre - la base 10 est celle que vous êtes le plus susceptible d'utiliser.

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

itoa est une fonction très utile, qui est prise en charge par certains compilateurs - c'est dommage qu'elle ne soit pas prise en charge par tous, contrairement à atoi.

Si vous voulez toujours utiliser itoa, voici comment vous devriez 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 en binaire est %s\n",  itoa(15, str, 2));

6voto

user2622016 Points 773

Utilisez snprintf - il est standard et disponible dans tous les compilateurs. Demandez la taille nécessaire en l'appelant avec les paramètres NULL, 0. Allouez un caractère de plus pour le null à la fin.

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

4voto

Shamim Hafiz Points 8419

Il vaut mieux utiliser sprintf(),

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

3voto

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 stringLen=1;

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

et voici un exemple:

char buffer[33];
int main(){
  my_utoa(54321, buffer, 10);
  printf(buffer);
  printf("\n");

  my_utoa(13579, buffer, 10);
  printf(buffer);
  printf("\n");
}

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