Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Convertir un double en char* en Ansi-C

13 réponses
Avatar
Helfer Thomas
Bonjour,

Cela est sans doute quelque chose de très facile, mais que je ne sais pas
faire (en cherchant je n'ai trouvé que des fonctions non ANSI-C :
itoa et ltoa sur DOS par exemple).

Merci de votre aide

10 réponses

1 2
Avatar
Pierre Maurette
Helfer Thomas a écrit:

Bonjour,

Cela est sans doute quelque chose de très facile, mais que je ne sais pas
faire (en cherchant je n'ai trouvé que des fonctions non ANSI-C :
itoa et ltoa sur DOS par exemple).
sprintf(), peut-être ?

--
Pierre

Avatar
Helfer Thomas
Le Sun, 26 Sep 2004 11:12:55 +0200, Pierre Maurette a écrit :

Helfer Thomas a écrit:

Bonjour,

Cela est sans doute quelque chose de très facile, mais que je ne sais pas
faire (en cherchant je n'ai trouvé que des fonctions non ANSI-C :
itoa et ltoa sur DOS par exemple).
sprintf(), peut-être ?



Oui, il y a sprintf(), mais cette solution suppose que l'on connaisse à
l'avance la taille de la chaine de caractères qui contiendra mon double.
J'espérai en fin une solution plus "propre" :)


Avatar
Jean-Marc
"Helfer Thomas" a écrit dans le message de
news:

Helfer Thomas a écrit:

Bonjour,

Cela est sans doute quelque chose de très facile, mais que je ne sais
pas



faire (en cherchant je n'ai trouvé que des fonctions non ANSI-C :
itoa et ltoa sur DOS par exemple).
sprintf(), peut-être ?



Oui, il y a sprintf(), mais cette solution suppose que l'on connaisse à
l'avance la taille de la chaine de caractères qui contiendra mon double.
J'espérai en fin une solution plus "propre" :)


Hello,

c'est la façon "propre" et standard de faire.
Tu dois juste dimensionner un buffer assez grand pour
stocker le résultat. C'est d'autant plus facile qu'avec sprintf
tu peux spécifier le format de sortie.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."



Avatar
Erwann ABALEA
On Sun, 26 Sep 2004, Helfer Thomas wrote:

[...]
Oui, il y a sprintf(), mais cette solution suppose que l'on connaisse à
l'avance la taille de la chaine de caractères qui contiendra mon double.
J'espérai en fin une solution plus "propre" :)


Si tu as un compilateur C99, tu as alors snprintf(), qui te permet de
connaître la taille de la chaîne à allouer, au prix d'un appel
supplémentaire à snprintf. Tu fais donc 2 appels: un premier pour avoir la
taille, et un deuxième pour effectuer la transformation et obtenir le
résultat.

Attention aux différentes implémentations de snprintf, certaines
n'autorisent pas une taille nulle, certaines n'autorisent pas un pointeur
destination nul, ...

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
Malheureusement c'est dur, a force de découper les points godwin que
je gagne, de lire quoi que ce soit sur mon écran.
-+- JC in GNU : couper (au burin) - coller (à la glue) -+-

Avatar
Vincent Lefevre
Dans l'article ,
Erwann ABALEA écrit:

Si tu as un compilateur C99, tu as alors snprintf(), qui te permet
de connaître la taille de la chaîne à allouer, au prix d'un appel
supplémentaire à snprintf. Tu fais donc 2 appels: un premier pour
avoir la taille, et un deuxième pour effectuer la transformation et
obtenir le résultat.


Question efficacité, il est préférable de faire un sprintf dans un
buffer trop grand, puis de faire une copie, non?

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

Avatar
Erwann ABALEA
On Sun, 26 Sep 2004, Vincent Lefevre wrote:

Dans l'article ,
Erwann ABALEA écrit:

Si tu as un compilateur C99, tu as alors snprintf(), qui te permet
de connaître la taille de la chaîne à allouer, au prix d'un appel
supplémentaire à snprintf. Tu fais donc 2 appels: un premier pour
avoir la taille, et un deuxième pour effectuer la transformation et
obtenir le résultat.


Question efficacité, il est préférable de faire un sprintf dans un
buffer trop grand, puis de faire une copie, non?


Si tu es certain que ton buffer est trop grand, c'est une solution moins
coûteuse, en effet.

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
Ma femme a appris sur une 400 four que je revends également si ça
t'intéresse. C'est pas trop puissant et tu as une position bien droite.
Même elle qui est couillonne comme pas deux s'est bien amusée deçu.
-+- OW in http://neuneu.mine.nu : Gai gai, marions nous -+-


Avatar
Antoine Leca
En , Helfer Thomas va escriure:
Oui, il y a sprintf(), mais cette solution suppose que l'on connaisse
à l'avance la taille de la chaine de caractères qui contiendra mon
double. J'espérai en fin une solution plus "propre" :)


Je ne comprends pas ton problème.

En C, les chaînes de caractères ne se créent pas par magie, il faut les
allouer avant de faire appel aux fonctions de bibliothèque. C'est vrai pour
s*printf comme pour itoa.

Si tu veux dimensioner correctement la chaîne de caractères, tu peux le
faire avec les éléments du format, en particulier la précision; attention
seulement aux exposants, qui peuvent facilement provoquer des débordements
suite à des erreurs de calcul, surtout si les calculs ne sont pas contrôlés
par ailleurs; c'est particulièrement vrai pour les formats %f, évidemment.


Antoine

Avatar
Antoine Leca
En 20040926183307$, Vincent Lefevre va escriure:
Erwann ABALEA écrit:

Si tu as un compilateur C99, tu as alors snprintf(),



Pas un problème de compilateur. Suffit d'une bibliothèque standard
compatible C99. Par exemple, glibc depuis des années.


Question efficacité, il est préférable de faire un sprintf dans un
buffer trop grand, puis de faire une copie, non?


Question sûreté (débordements de tampons), vaut mieux utiliser snprintf,
non?

Ce n'est pas tant pour aller dans le sens des ayatollahs qui veulent
interdire purement et simplement l'utilisation de fonctions comme sprintf,
que parce que avec les deux appels à snprintf, l'intention est claire, il
n'y a pas de doutes à avoir et donc le petit malin qui passe derrière toi
pour « optimiser » ton code ne va pas se permettre de remplacer ton tampon
« trop grand » par un tampon qui va se réveler « trop juste », et envoyer ta
superbe fusée au fin fond de l'Atlantique ou ailleurs...

D'autre part, si tu as le choix d'utiliser snprintf, tu as la ressource
d'utiliser snprintf avec comme paramètre la taille de ton tampon « calculé
juste » (autrement dit, l'utilisation naturelle de snprintf), qui est aussi
efficace sinon plus que sprintf.

Par ailleurs, pour revenir au cas présent, je ne sais pas ce que veut
exactement le questionneur initial, mais peut-être veut-il une allocation
dynamique du résultat. Et à ce moment-là, les questions de performances de
s*printf doivent être comparées à celles du malloc, + l'éventuel realloc si
on choisit l'allocation a priori et que l'on veut économiser la mémoire...


Antoine


Avatar
Erwann ABALEA
On Mon, 27 Sep 2004, Antoine Leca wrote:

En 20040926183307$, Vincent Lefevre va escriure:
Erwann ABALEA écrit:

Si tu as un compilateur C99, tu as alors snprintf(),



Pas un problème de compilateur. Suffit d'une bibliothèque standard
compatible C99. Par exemple, glibc depuis des années.


Ma gueule. C'est exact, je m'en sers depuis plus longtemps que
l'installation de mon gcc 3.x.

[...]
Par ailleurs, pour revenir au cas présent, je ne sais pas ce que veut
exactement le questionneur initial, mais peut-être veut-il une allocation
dynamique du résultat. Et à ce moment-là, les questions de performances de
s*printf doivent être comparées à celles du malloc, + l'éventuel realloc si
on choisit l'allocation a priori et que l'on veut économiser la mémoire...


Je pense que Vincent comparait un
-----
char *buf;
int taille;
taille=snprintf(NULL, ...);
buf=malloc(taille)
snprintf(buf, taille, ...);
-----

et un
-----
char staticbuf[assezgrand];
char *buf;
sprintf(staticbuf, ...);
buf=strdup(staticbuf);
-----

Dans le deuxième cas, pas de realloc, mais il faut être certain que
"assezgrand" le soit réellement.

De plus, sans avoir lu le source d'une implémentation classique, je pense
que le coût d'un snprintf() devrait être supérieur au coût d'un sprintf().
Quant à comparer le coût d'un snprintf() au coût d'un strdup (qui est une
suite strlen, malloc, et strcpy), il faudrait prendre en compte le cas où
de la mémoire doit être demandée à l'OS, le cas où la machine n'a pas de
MMU, ... Difficile de trancher.

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
SJ> Just do it.
TM> Traduction ?
Bouge toi le cul.
-+- RMD in <http://neuneu.mine.nu> : Move your ass -+-



Avatar
Vincent Lefevre
Dans l'article <cj8t0n$r3e$,
Antoine Leca écrit:

En 20040926183307$, Vincent Lefevre va escriure:

Question efficacité, il est préférable de faire un sprintf dans un
buffer trop grand, puis de faire une copie, non?


Question sûreté (débordements de tampons), vaut mieux utiliser snprintf,
non?


Rien n'empêche de limiter et vérifier les débordements a priori.
Sinon, on peut toujours utiliser snprintf + une copie éventuelle
au lieu de 2 snprintf.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA


1 2