Comment concatener un double a une chaine de caractere ?
Comment concatener un double a une chaine de caractere ?
Comment concatener un double a une chaine de caractere ?
#include <stdio.h>
...
double a;
char str[100];
...
sprintf(str, "%s %f", str, a);
Une chose a verifier, cette methode lit et ecrit en meme temps sur al
chaine str... C'est pas tres catholique...
#include <stdio.h>
...
double a;
char str[100];
...
sprintf(str, "%s %f", str, a);
Une chose a verifier, cette methode lit et ecrit en meme temps sur al
chaine str... C'est pas tres catholique...
#include <stdio.h>
...
double a;
char str[100];
...
sprintf(str, "%s %f", str, a);
Une chose a verifier, cette methode lit et ecrit en meme temps sur al
chaine str... C'est pas tres catholique...
Avec sprintf()
osé...char s[128];
c'est la partie que je préfèreint n = sprintf (s, "%s", "hello world: ");
n += sprintf (s + n, "%f", 123.456);
Dans ton exemple bien précis, ça marche.
Maintenant il demandait pour écrire "une" chaine et "un" double. Donc à
priori aucune indication sur la longueur de la chaine obtenue => le mal est
en toi.
Maintenant c'est bien gentil de critiquer mais je suppose que prendre un
char [] taille fixe c'est pour éviter d'allouer à tout vent.
Je proposerai peut-être ça:
#include <stdio.h>
#include <stdlib.h>
#define TAILLE_B 128
char *
ma_concat (char *chaine, double nombre)
{
char *output = xmalloc (TAILLE_B);
size_t longueur;
if ((longueur =
snprintf (output, TAILLE_B, "%s %f", chaine, nombre))= TAILLE_B)
{
output = xrealloc (output, longueur + 1);
sprintf (output, "%s %f", chaine, nombre);
}
return output;
}
/* xmalloc et xrealloc définies par l'utilisateur, testant les retours des
malloc et realloc */
Avec sprintf()
osé...
char s[128];
c'est la partie que je préfère
int n = sprintf (s, "%s", "hello world: ");
n += sprintf (s + n, "%f", 123.456);
Dans ton exemple bien précis, ça marche.
Maintenant il demandait pour écrire "une" chaine et "un" double. Donc à
priori aucune indication sur la longueur de la chaine obtenue => le mal est
en toi.
Maintenant c'est bien gentil de critiquer mais je suppose que prendre un
char [] taille fixe c'est pour éviter d'allouer à tout vent.
Je proposerai peut-être ça:
#include <stdio.h>
#include <stdlib.h>
#define TAILLE_B 128
char *
ma_concat (char *chaine, double nombre)
{
char *output = xmalloc (TAILLE_B);
size_t longueur;
if ((longueur =
snprintf (output, TAILLE_B, "%s %f", chaine, nombre))
= TAILLE_B)
{
output = xrealloc (output, longueur + 1);
sprintf (output, "%s %f", chaine, nombre);
}
return output;
}
/* xmalloc et xrealloc définies par l'utilisateur, testant les retours des
malloc et realloc */
Avec sprintf()
osé...char s[128];
c'est la partie que je préfèreint n = sprintf (s, "%s", "hello world: ");
n += sprintf (s + n, "%f", 123.456);
Dans ton exemple bien précis, ça marche.
Maintenant il demandait pour écrire "une" chaine et "un" double. Donc à
priori aucune indication sur la longueur de la chaine obtenue => le mal est
en toi.
Maintenant c'est bien gentil de critiquer mais je suppose que prendre un
char [] taille fixe c'est pour éviter d'allouer à tout vent.
Je proposerai peut-être ça:
#include <stdio.h>
#include <stdlib.h>
#define TAILLE_B 128
char *
ma_concat (char *chaine, double nombre)
{
char *output = xmalloc (TAILLE_B);
size_t longueur;
if ((longueur =
snprintf (output, TAILLE_B, "%s %f", chaine, nombre))= TAILLE_B)
{
output = xrealloc (output, longueur + 1);
sprintf (output, "%s %f", chaine, nombre);
}
return output;
}
/* xmalloc et xrealloc définies par l'utilisateur, testant les retours des
malloc et realloc */
if ((longueur >>> snprintf (output, TAILLE_B, "%s %f", chaine, nombre))= TAILLE_B)
Est-tu bien sûr que snprintf() retourne le nombre de bytes théoriques? de
plus, je rappelle que tout le monde ne dispose pas de cette fonction
(C99).
En effet, c'est du C99.
Mais tu mets le doigt sur un problème évident. Selon l'implémentation, le
retour change. Dans le monde des féées, avec une glibc pas trop trop
vieille, ça se comporte impec.
Maintenant, avec une version qui le supporte mais plus anciennes, (de la
2.0.6 à la 2.1 [tiré d'un man]), il va retourner 0 si c'est tronqué.
La question qui me vient à l'esprit, car ce n'est pas très clair, c'est que
dans ce cas, snprintf tronquet et ajoute un ' ' ? Comment connaitre la
longueur si ce n'est en tatonant ? (i.e. réallouant au fur et à mesure dans
une boucle)
S'il veut faire ça un peu mieu, il fera un
return NULL;
ce qui est surement le plus probable puisque la fonction était censée
retourner un (char *)
if ((longueur >>> snprintf (output, TAILLE_B, "%s %f", chaine, nombre))
= TAILLE_B)
Est-tu bien sûr que snprintf() retourne le nombre de bytes théoriques? de
plus, je rappelle que tout le monde ne dispose pas de cette fonction
(C99).
En effet, c'est du C99.
Mais tu mets le doigt sur un problème évident. Selon l'implémentation, le
retour change. Dans le monde des féées, avec une glibc pas trop trop
vieille, ça se comporte impec.
Maintenant, avec une version qui le supporte mais plus anciennes, (de la
2.0.6 à la 2.1 [tiré d'un man]), il va retourner 0 si c'est tronqué.
La question qui me vient à l'esprit, car ce n'est pas très clair, c'est que
dans ce cas, snprintf tronquet et ajoute un ' ' ? Comment connaitre la
longueur si ce n'est en tatonant ? (i.e. réallouant au fur et à mesure dans
une boucle)
S'il veut faire ça un peu mieu, il fera un
return NULL;
ce qui est surement le plus probable puisque la fonction était censée
retourner un (char *)
if ((longueur >>> snprintf (output, TAILLE_B, "%s %f", chaine, nombre))= TAILLE_B)
Est-tu bien sûr que snprintf() retourne le nombre de bytes théoriques? de
plus, je rappelle que tout le monde ne dispose pas de cette fonction
(C99).
En effet, c'est du C99.
Mais tu mets le doigt sur un problème évident. Selon l'implémentation, le
retour change. Dans le monde des féées, avec une glibc pas trop trop
vieille, ça se comporte impec.
Maintenant, avec une version qui le supporte mais plus anciennes, (de la
2.0.6 à la 2.1 [tiré d'un man]), il va retourner 0 si c'est tronqué.
La question qui me vient à l'esprit, car ce n'est pas très clair, c'est que
dans ce cas, snprintf tronquet et ajoute un ' ' ? Comment connaitre la
longueur si ce n'est en tatonant ? (i.e. réallouant au fur et à mesure dans
une boucle)
S'il veut faire ça un peu mieu, il fera un
return NULL;
ce qui est surement le plus probable puisque la fonction était censée
retourner un (char *)
Que dit la norme?
7.19.6.5 The snprintf function
C'est le problème des fonctions pré-ISO qui ressemblent à des fonctions
ISO. Très dangereux!
Ce cas là n'étant pas standard, on s'en tape.
Si j'ai bien compris, on
peut faire une "mesure" en mettant par exemple une taille de 1, ensuite on
alloue le bloc, puis on utilise le bloc alloué.
C'est pas mal!
char s_try[1]
size_t len = snprintf (s_try
, sizeof stry
, "%s : %.2f euros"
, "prix de l'article"
, 123.45);
char *s_out = malloc (len + 1);
if (s_out)
{
len = snprintf (s_out
, len + 1
, "%s : %.2f euros"
, "prix de l'article"
, 123.45);
printf ("%sn", s_out);
free (s_out);
}S'il veut faire ça un peu mieu, il fera un
return NULL;
ce qui est surement le plus probable puisque la fonction était censée
retourner un (char *)
C'est une macro alors? Parce que si c'est xalloc() qui retourne NULL,
merci, on avait déjà malloc()!
Que dit la norme?
7.19.6.5 The snprintf function
C'est le problème des fonctions pré-ISO qui ressemblent à des fonctions
ISO. Très dangereux!
Ce cas là n'étant pas standard, on s'en tape.
Si j'ai bien compris, on
peut faire une "mesure" en mettant par exemple une taille de 1, ensuite on
alloue le bloc, puis on utilise le bloc alloué.
C'est pas mal!
char s_try[1]
size_t len = snprintf (s_try
, sizeof stry
, "%s : %.2f euros"
, "prix de l'article"
, 123.45);
char *s_out = malloc (len + 1);
if (s_out)
{
len = snprintf (s_out
, len + 1
, "%s : %.2f euros"
, "prix de l'article"
, 123.45);
printf ("%sn", s_out);
free (s_out);
}
S'il veut faire ça un peu mieu, il fera un
return NULL;
ce qui est surement le plus probable puisque la fonction était censée
retourner un (char *)
C'est une macro alors? Parce que si c'est xalloc() qui retourne NULL,
merci, on avait déjà malloc()!
Que dit la norme?
7.19.6.5 The snprintf function
C'est le problème des fonctions pré-ISO qui ressemblent à des fonctions
ISO. Très dangereux!
Ce cas là n'étant pas standard, on s'en tape.
Si j'ai bien compris, on
peut faire une "mesure" en mettant par exemple une taille de 1, ensuite on
alloue le bloc, puis on utilise le bloc alloué.
C'est pas mal!
char s_try[1]
size_t len = snprintf (s_try
, sizeof stry
, "%s : %.2f euros"
, "prix de l'article"
, 123.45);
char *s_out = malloc (len + 1);
if (s_out)
{
len = snprintf (s_out
, len + 1
, "%s : %.2f euros"
, "prix de l'article"
, 123.45);
printf ("%sn", s_out);
free (s_out);
}S'il veut faire ça un peu mieu, il fera un
return NULL;
ce qui est surement le plus probable puisque la fonction était censée
retourner un (char *)
C'est une macro alors? Parce que si c'est xalloc() qui retourne NULL,
merci, on avait déjà malloc()!
Avec sprintf()
osé...
char s[128];
c'est la partie que je préfère
int n = sprintf (s, "%s", "hello world: ");
n += sprintf (s + n, "%f", 123.456);
Avec sprintf()
osé...
char s[128];
c'est la partie que je préfère
int n = sprintf (s, "%s", "hello world: ");
n += sprintf (s + n, "%f", 123.456);
Avec sprintf()
osé...
char s[128];
c'est la partie que je préfère
int n = sprintf (s, "%s", "hello world: ");
n += sprintf (s + n, "%f", 123.456);
correctement : il suffit alors d'un assert() bien placé, testant aussi
bien les positifs que les négatifs!
Excusez-moi pour le bruit, mais: Antoine, tu voudrais pas configurer ton
correctement : il suffit alors d'un assert() bien placé, testant aussi
bien les positifs que les négatifs!
Excusez-moi pour le bruit, mais: Antoine, tu voudrais pas configurer ton
correctement : il suffit alors d'un assert() bien placé, testant aussi
bien les positifs que les négatifs!
Excusez-moi pour le bruit, mais: Antoine, tu voudrais pas configurer ton
On Wed, 9 Jul 2003, Fanny Chevalier wrote:Comment concatener un double a une chaine de caractere ?
#include <stdio.h>
...
double a;
char str[100];
...
sprintf(str, "%s %f", str, a);
Une chose a verifier, cette methode lit et ecrit en meme temps sur al
chaine str... C'est pas tres catholique...
Autre methode plus complexe :
#include <stdio.h>
#include <string.h>
...
double a;
char str1[100], str2[100];
...
sprintf(str2, "%f", a);
strcat(str1, str2);
Voila
Divide ut regnes.
Divise afin de regner
Youssouf
La deuxième méthode me semble correcte, à condition de rajouter un test
On Wed, 9 Jul 2003, Fanny Chevalier wrote:
Comment concatener un double a une chaine de caractere ?
#include <stdio.h>
...
double a;
char str[100];
...
sprintf(str, "%s %f", str, a);
Une chose a verifier, cette methode lit et ecrit en meme temps sur al
chaine str... C'est pas tres catholique...
Autre methode plus complexe :
#include <stdio.h>
#include <string.h>
...
double a;
char str1[100], str2[100];
...
sprintf(str2, "%f", a);
strcat(str1, str2);
Voila
Divide ut regnes.
Divise afin de regner
Youssouf
La deuxième méthode me semble correcte, à condition de rajouter un test
On Wed, 9 Jul 2003, Fanny Chevalier wrote:Comment concatener un double a une chaine de caractere ?
#include <stdio.h>
...
double a;
char str[100];
...
sprintf(str, "%s %f", str, a);
Une chose a verifier, cette methode lit et ecrit en meme temps sur al
chaine str... C'est pas tres catholique...
Autre methode plus complexe :
#include <stdio.h>
#include <string.h>
...
double a;
char str1[100], str2[100];
...
sprintf(str2, "%f", a);
strcat(str1, str2);
Voila
Divide ut regnes.
Divise afin de regner
Youssouf
La deuxième méthode me semble correcte, à condition de rajouter un test
Excusez-moi pour le bruit, mais: Antoine, tu voudrais pas configurer ton
client news correctement
Excusez-moi pour le bruit, mais: Antoine, tu voudrais pas configurer ton
client news correctement
Excusez-moi pour le bruit, mais: Antoine, tu voudrais pas configurer ton
client news correctement
Je vous prie vraiment de m'excuser :o(. Cette fois-ci ce devrait être
mieux...
Bertrand Mollinier Toublet écrivit:Excusez-moi pour le bruit, mais: Antoine, tu voudrais pas configurer ton
client news correctement
Hmmm.... Désolé, j'ai oublié de "repasser" le message en encodage standard.
(Je compose en encodage "user-defined", seule manière simple que j'ai trouvé
de pouvoir couper les lignes au bon endroit avec ce @#! de client qui pense
savoir mieux que moi ce que je veux envoyer; et là j'ai oublié de repasser
en Latin-[19], ce que je fait d'habitude).
Pas de probleme. Pour le coup, tu piques ma curiosite. En quoi
Je vous prie vraiment de m'excuser :o(. Cette fois-ci ce devrait être
mieux...
Bertrand Mollinier Toublet écrivit:
Excusez-moi pour le bruit, mais: Antoine, tu voudrais pas configurer ton
client news correctement
Hmmm.... Désolé, j'ai oublié de "repasser" le message en encodage standard.
(Je compose en encodage "user-defined", seule manière simple que j'ai trouvé
de pouvoir couper les lignes au bon endroit avec ce @#! de client qui pense
savoir mieux que moi ce que je veux envoyer; et là j'ai oublié de repasser
en Latin-[19], ce que je fait d'habitude).
Pas de probleme. Pour le coup, tu piques ma curiosite. En quoi
Je vous prie vraiment de m'excuser :o(. Cette fois-ci ce devrait être
mieux...
Bertrand Mollinier Toublet écrivit:Excusez-moi pour le bruit, mais: Antoine, tu voudrais pas configurer ton
client news correctement
Hmmm.... Désolé, j'ai oublié de "repasser" le message en encodage standard.
(Je compose en encodage "user-defined", seule manière simple que j'ai trouvé
de pouvoir couper les lignes au bon endroit avec ce @#! de client qui pense
savoir mieux que moi ce que je veux envoyer; et là j'ai oublié de repasser
en Latin-[19], ce que je fait d'habitude).
Pas de probleme. Pour le coup, tu piques ma curiosite. En quoi