398 votes

Comment convertir un int en string en C ?

Comment convertir un int (entier) à une chaîne de caractères ? J'essaie de créer une fonction qui convertit les données d'un fichier struct en une chaîne de caractères pour l'enregistrer dans un fichier.

4 votes

printf ou l'un de ses cousins devrait faire l'affaire

1 votes

1 votes

Vous pouvez également consulter cette FAQ sur la sérialisation, et peut-être les questions suivantes qui concernent la sérialisation en C : (a) , (b) , (c) pour atteindre votre intention réelle.

404voto

cnicutar Points 98451

Vous pouvez utiliser sprintf pour le faire, ou peut-être snprintf si vous l'avez :

char str[ENOUGH];
sprintf(str, "%d", 42);

Où le nombre de caractères (plus le caractère de fin de ligne) dans le champ str peut être calculé en utilisant :

(int)((ceil(log10(num))+1)*sizeof(char))

18 votes

Pour être sûr de l'état ENOUGH est suffisant, nous pouvons le faire en malloc(sizeof(char)*(int)log10(num))

4 votes

@Hauleth Ou même +2, considérant que (int)log10(42) es 1 .

38 votes

Ou vous pouvez le calculer au moment de la compilation : #define ENOUGH ((CHAR_BIT * sizeof(int) - 1) / 3 + 2)

173voto

Alexander Galkin Points 4312

EDIT : Comme indiqué dans le commentaire, itoa() n'est pas un standard, il vaut mieux utiliser l'approche sprintf() suggérée dans la réponse concurrente !


Vous pouvez utiliser itoa() à la fonction convertir votre valeur entière en une chaîne de caractères.

Voici un exemple :

int num = 321;
char snum[5];

// convert 123 to string [buf]
itoa(num, snum, 10);

// print our string
printf("%s\n", snum);

Si vous voulez sortir votre structure dans un fichier, il n'est pas nécessaire de convertir une valeur au préalable. Vous pouvez simplement utiliser la fonction spécification du format printf pour indiquer comment sortir vos valeurs et utiliser n'importe lequel des opérateurs de l'option famille printf pour sortir vos données.

61 votes

itoa n'est pas standard - voir par exemple stackoverflow.com/questions/190229/

2 votes

@PaulR Je ne le savais pas ! Merci pour la clarification.

1 votes

@PaulR Merci, je ne le savais pas !

45voto

David C. Rankin Points 2674

Après avoir examiné diverses versions de itoa pour gcc, la version la plus souple que j'ai trouvée, capable de gérer les conversions en binaire, décimal et hexadécimal, tant positives que négatives, est la quatrième version qui se trouve à l'adresse suivante http://www.strudel.org.uk/itoa/ . Alors que sprintf / snprintf ont des avantages, ils ne traiteront pas les nombres négatifs pour autre chose que la conversion décimale. Comme le lien ci-dessus est soit hors ligne, soit plus actif, j'ai inclus leur 4ème version ci-dessous :

/**
 * C++ version 0.4 char* style "itoa":
 * Written by Lukás Chmela
 * Released under GPLv3.
 */
char* itoa(int value, char* result, int base) {
    // check that the base if valid
    if (base < 2 || base > 36) { *result = '\0'; return result; }

    char* ptr = result, *ptr1 = result, tmp_char;
    int tmp_value;

    do {
        tmp_value = value;
        value /= base;
        *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
    } while ( value );

    // Apply negative sign
    if (tmp_value < 0) *ptr++ = '-';
    *ptr-- = '\0';
    while(ptr1 < ptr) {
        tmp_char = *ptr;
        *ptr--= *ptr1;
        *ptr1++ = tmp_char;
    }
    return result;
}

9 votes

De plus, cette méthode est considérablement plus rapide que sprintf. Cela peut être important lors du vidage de gros fichiers.

0 votes

@Eugene Ryabtsev C ne spécifie pas l'évaluation de la performance de sprintf() et "ceci est considérablement plus rapide que sprintf" peut être vrai sur votre compilateur mais ne l'est pas toujours. Un compilateur peut regarder dans sprintf(str, "%d", 42); et l'optimiser pour obtenir un itoa() comme une fonction - certainement plus rapide que ce code utilisateur.

4 votes

@chux Oui, un compilateur pourrait optimiser sprintf(str, "%d", 42); comme l'ajout de deux caractères constants, mais c'est une théorie. En pratique, les gens ne sprintent pas les constantes ints et l'itoa ci-dessus est presque aussi optimisé qu'il peut l'être. Au moins, vous pouvez être sûr à 100% que vous n'obtiendrez pas des ordres de grandeur inférieurs à ceux d'un sprintf générique. Ce serait bien de voir le contre-exemple que vous avez en tête, avec la version et les paramètres du compilateur.

13voto

catfood Points 29

C'est vieux mais il y a une autre façon.

#include <stdio.h>

#define atoa(x) #x

int main(int argc, char *argv[])
{
    char *string = atoa(1234567890);
    printf("%s\n", string);
    return 0;
}

55 votes

Ne fonctionne que pour les constantes, pas pour les variables.

0 votes

Pourquoi cela ne fonctionne-t-il pas si j'y mets une macro ? N'est-ce pas aussi une constante ?

3voto

user2374601 Points 11

Si vous voulez sortir votre structure dans un fichier, il n'est pas nécessaire de convertir une valeur au préalable. Vous pouvez simplement utiliser la spécification du format printf pour indiquer comment sortir vos valeurs et utiliser n'importe quel opérateur de la famille printf pour sortir vos données.

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