Comment convertir long non signé en chaîne
Dans le langage C, comment puis-je convertir des unsigned long de la valeur à une chaîne de caractères (char *) et garder mon code source portable ou tout simplement recompiler pour travailler sur d'autres plate-forme (sans avoir à réécrire le code?
Par exemple, si j'ai sprintf(buffer, format, value)
comment puis-je déterminer la taille de tampon avec plate-forme de manière indépendante?
source d'informationauteur Walidix
Vous devez vous connecter pour publier un commentaire.
L'approche standard consiste à utiliser
sprintf(buffer, "%lu", value);
d'écrire une chaîne de caractères représentant devalue
àbuffer
. Toutefois, le dépassement est un problème potentiel, commesprintf
heureusement (et sans le savoir) d'écrire sur la fin de votre tampon.C'est effectivement d'une grande faiblesse de sprintf, partiellement résolu en C++ en utilisant les flux plutôt que des tampons. L'habituel "réponse" est à attribuer à un très généreux tampon rare à débordement, laissez sprintf de sortie, et ensuite utiliser strlen pour déterminer la longueur de la chaîne produite, calloc un tampon d' (taille + 1) et la copie de la chaîne.
Ce site explique cette et des problèmes liés à une certaine longueur.
Certaines bibliothèques offrent
snprintf
comme une alternative qui vous permet de spécifier une taille maximale de mémoire tampon.vous pouvez écrire une fonction qui convertit de type unsigned long de str, semblable à ltostr fonction de la bibliothèque.
vous pouvez vous référer à mon blog ici ce qui explique la mise en œuvre et l'utilisation de l'exemple.
Essayez d'utiliser
sprintf
:Edit:
Notez que vous devez allouer un tampon à l'avance, et n'ai aucune idée de combien de temps les numéros seront effectivement quand vous le faites. Je suis en supposant 32bit
long
s, qui peut produire des nombres aussi grands que 10 chiffres.Voir Carl Smotricz de réponse pour mieux expliquer les enjeux.
Pour une valeur de type long, vous devez ajouter de la longueur des infos " l " et " u " pour un entier décimal non signé,
comme une référence des options disponibles, voir sprintf