Comment faire pour convertir un int en string en C?
Comment voulez-vous convertir un int
(entier) d'une chaîne de caractères? Je suis en train de faire une fonction qui convertit les données d'un struct
dans une chaîne à enregistrer dans un fichier.
printf
ou l'un de ses cousins devrait faire l'affaire- double possible de Où est la ltid fonction dans Linux?
- vous pouvez aussi consulter le cette FAQ sur la sérialisation, et peut-être les questions suivantes qui se rapportent à la sérialisation dans C: (a), (b) (c) pour atteindre votre objectif réel.
- Mon habitude animal de compagnie sémantique bête noire ici. Vous ne voulez pas de convertir quoi que ce soit; vous souhaitez obtenir une chaîne de caractères contenant une (base 10?) la représentation de la valeur de la
int
. Ouais, je sais. C'est un très commun de coupe courte, mais il reste encore des bugs moi. - double possible de la Conversion de int en string en c
Vous devez vous connecter pour publier un commentaire.
EDIT: Comme souligné dans le commentaire,
itoa()
n'est pas un standard, afin de mieux utiliser sprintf() approche proposée dans l'rivalisant de réponse!Vous pouvez utiliser
itoa()
fonction de convertir votre valeur entière à une chaîne.Voici un exemple:
Si vous voulez sortir de votre structure dans un fichier, il n'est pas nécessaire de convertir n'importe quelle valeur à l'avance. Vous pouvez simplement utiliser le une spécification de format de printf pour indiquer la façon de sortie de vos valeurs et de l'utiliser tous les opérateurs de printf famille pour la production de vos données.
itoa
n'est pas standard, voir par exemple stackoverflow.com/questions/190229/...itoa()
subit le même débordement de la mémoire tampon de potentiel degets()
.sprintf
ouitoa
? Éventuellement, lors de l'écriture d'une coutume de la bibliothèque standard?Vous pouvez utiliser
sprintf
de le faire, ou peut-êtresnprintf
si vous l'avez:Où le nombre de caractères (plus de résiliation de char) dans le
str
peut être calculée à l'aide de:ENOUGH
est assez nous pouvons le faire parmalloc(sizeof(char)*(int)log10(num))
(int)log10(42)
est1
.(ceil(log10(num))+1)*sizeof(char)
#define ENOUGH ((CHAR_BIT * sizeof(int) - 1) / 3 + 2)
((CHAR_BIT * sizeof(int) - 1) / 3 + 2)
échoue pour rare, mais possible,int
largeurs comme 18. Simplement éliminer la-1
.int length = snprintf(NULL, 0,"%d",42);
pour obtenir la longueur, puis alloclength+1
caractères de la chaîne.snprintf
avec unNULL
tampon pour déterminer la meilleure taille de la mémoire tampon est un grand tour! Voici une comparaison de laprintf
membres pour ceux qui pourraient être intéressés.snprintf
démontrer comment sa taille de la mémoire tampon peut être utilisé dans d'autres façons créatives.(int)((ceil(log10(num))+1)*sizeof(char))
est faux. Ce doit être correcte pour tous lesint
valeurs (mais je ne voudrais pas utiliser cette abomination dans le code réel):(int)((floor(log10(i==INT_MIN?INT_MAX:i<0?-i:i>0?i:1)+(i>=0?2:3))))
. J'ai laissé tomber lasizeof(char)
car il est toujours de 1. Remarque: ISO C règles garantissent queINT_MIN
etINT_MAX
toujours avoir le même nombre de chiffres.log10(0) = -1
...La réponse courte est:
Le plus est: d'abord vous devez trouver une taille suffisante.
snprintf
vous indique la longueur si vous l'appelez, avecNULL, 0
comme première paramètres:Attribuer un caractère plus pour les nuls-terminator.
Si travaux pour chaque chaîne de format, de sorte que vous pouvez convertir en float ou double à la chaîne à l'aide de
"%g"
, vous pouvez les convertir en int au sortilège de l'aide"%x"
, et ainsi de suite.Après avoir regardé les différentes versions de la ltid pour gcc, la plus flexible de la version que j'ai trouvé qui est capable de traiter les conversions binaire, décimal et hexadécimal, à la fois positif et négatif est la quatrième version trouvée à http://www.strudel.org.uk/itoa/. Alors que
sprintf
/snprintf
ont des avantages, ils ne seront pas gérer les nombres négatifs pour autre chose que la virgule de conversion. Depuis le lien ci-dessus est soit hors ligne ou n'est plus actif, j'ai inclus une 4ème version ci-dessous:sprintf()
et "ce qui est considérablement plus rapide que sprintf" peut-être vrai sur votre compilateur, mais pas toujours. Un compilateur peut regarder danssprintf(str, "%d", 42);
et de l'optimiser pour une optimisationitoa()
comme fonction - bien plus vite qu'avec cet utilisateur. code.sprintf(str, "%d", 42);
que l'ajout de deux const caractères, mais que c'est de la théorie. Dans la pratique, les gens n'ont pas sprintf const ints et la ltid ci-dessus est presque aussi optimisé qu'il obtient. Au moins vous pouvez être sûr à 100% que vous ne serait pas obtenir des ordres de grandeur déclassement d'un générique sprintf. Il serait agréable de voir tout ce contre-exemple que vous avez en tête, avec le compilateur de la version et les paramètres.char str[3]; sprintf(str, "%d", 42);
-->MOV #121A,W4, MOV W4,AF4, MOV #2A,W0 = 2A, MOV #0,W4, CALL 105E
intégré compilateur simple passe le tampon, et de 42 à unitoa()
-comme routine.C'est vieux mais voici une autre façon.
Si vous utilisez GCC, vous pouvez utiliser l'extension GNU asprintf fonction.
La conversion à une chaîne, soit 1) affecte la chaîne résultante ou 2) passer dans un
char *
de destination et la taille. Exemple de code ci-dessous:À la fois de travail pour tous les
int
y comprisINT_MIN
. Ils fournissent une qualité constante, contrairement àsnprintf()
qui dépend de la localisation en cours.Méthode 1: Retourne
NULL
de mémoire.Méthode 2: Il renvoie
NULL
si le tampon est trop petit.[Modifier] demande par @Alter Mann
(CHAR_BIT*sizeof(int_type)-1)*10/33+3
est au moins le nombre maximum dechar
nécessaires pour coder les quelques signé de type entier comme une chaîne constituée d'un signe négatif, des chiffres, et un caractère nul..Le nombre de non-signe bits d'un entier signé est pas plus de
CHAR_BIT*sizeof(int_type)-1
. Base 10 à la représentation d'unn
bits du nombre binaire prend jusqu'àn*log10(2) + 1
chiffres.10/33
est un peu plus delog10(2)
. +1 pour le signechar
et +1 pour le caractère null. D'autres fractions peut être utilisé comme 28/93.Méthode 3: Si on veut vivre sur le bord et de débordement de la mémoire tampon n'est pas une préoccupation, une simple C99 ou tard, la solution suivante qui gère tous
int
.Exemple de sortie
*10/33+3
*10/33+3
expliqué dans édités réponse.Si vous voulez sortir de votre structure dans un fichier, il n'est pas nécessaire de convertir n'importe quelle valeur à l'avance. Vous pouvez simplement utiliser le format de printf spécification pour indiquer la façon de sortie de vos valeurs et de l'utiliser tous les opérateurs de famille printf pour la production de vos données.
Utiliser la fonction
itoa()
pour convertir un entier à un chaînePar exemple: