OVH Cloud OVH Cloud

sprintf avec la classe string

4 réponses
Avatar
eric.bart
Borland avec BCB a introduit la fonction sprintf dans sa
classe AnsiString. Par ex :

AnsiString asTmp;
asTmp.sprintf("la valeur hexa de l'entier i est %#X\n",i);

On peut aussi enlever les espaces en début et fin avec
asTmp = asTmp.Trim();

On peut aussi changer la casse de la chaîne avec :
asTmp = asTmp.Lowercase();
asTmp = asTmp.Uppercase();

D'après ce lien :
http://gcc.gnu.org/onlinedocs/libstdc++/21_strings/howto.html#1
M$ aurait aussi introduit ces fonctions.

Il me semble que Borland l'a fait avant M$.

Dans tous les cas, il me semble que la solution proposée dans ce
lien pour pallier le manque de sprintf dans la classe string est
lourde et incomplète. N'est-il pas ?

4 réponses

Avatar
Loïc Joly
eric.bart wrote:

Borland avec BCB a introduit la fonction sprintf dans sa
classe AnsiString. Par ex :

AnsiString asTmp;
asTmp.sprintf("la valeur hexa de l'entier i est %#Xn",i);

[...]


D'après ce lien :
http://gcc.gnu.org/onlinedocs/libstdc++/21_strings/howto.html#1
M$ aurait aussi introduit ces fonctions.

Il me semble que Borland l'a fait avant M$.

Dans tous les cas, il me semble que la solution proposée dans ce
lien pour pallier le manque de sprintf dans la classe string est
lourde et incomplète. N'est-il pas ?


Ca doit dépendre des goûts. Personellement, je ne ressent pas le moindre
manque en ne voyant pas de sprintf dans les strings. A la limite si la
chaîne de format de sprintf permettait les arguments positionnels,
pourquoi pas, pour l'internationnalisation. Mais en tant que telle,
bof... D'autres (plein, même, peut être des gens ayant commencé en C et
donc sachant lire une telle chaîne de format ?) ne sont pas de cet avis.

Il y a par exemple boost::format
http://www.boost.org/libs/format/index.htm ou encore gbFormat
http://www.gabi-soft.fr/code/Util/IO/Format/ qui présentent a priori un
avantage certain sur l'ansiString que tu présentes : Il n'y a pas de
fonctions à arguments variables appelées.

--
Loïc

Avatar
Fabien LE LEZ
On Sun, 19 Oct 2003 13:26:36 +0200, "eric.bart"
wrote:

il me semble que la solution proposée dans ce
lien pour pallier le manque de sprintf dans la classe string est
lourde et incomplète.


Le problème avec sprintf, c'est que tu obtiens facilement des bugs
bizarres et difficiles à cerner. Du style :

char const* ch1;
char const* ch2;
int i;
...
sprintf (..., "%s %s", ch1, i, ch2); // (1)

Pour le compilateur, la ligne (1) est parfaitement valide ; c'est à
l'exécution qu'on va avoir des problèmes.
La solution avec les *stream est certes plus lourde à écrire, mais
tellement plus facile à déboguer...

--
http://www.giromini.org/usenet-fr/repondre.html

Avatar
Bruno Personnel
Fabien LE LEZ wrote:

On Sun, 19 Oct 2003 13:26:36 +0200, "eric.bart"
wrote:


il me semble que la solution proposée dans ce
lien pour pallier le manque de sprintf dans la classe string est
lourde et incomplète.



Le problème avec sprintf, c'est que tu obtiens facilement des bugs
bizarres et difficiles à cerner. Du style :

char const* ch1;
char const* ch2;
int i;
...
sprintf (..., "%s %s", ch1, i, ch2); // (1)

Pour le compilateur, la ligne (1) est parfaitement valide ; c'est à
l'exécution qu'on va avoir des problèmes.
La solution avec les *stream est certes plus lourde à écrire, mais
tellement plus facile à déboguer...



Oui, mais aussi embêtante quand on veut faire du formattage dynamique.
Et la c'est vrai que printf et ses dérivés reste imbattable. Donc, ben,
ca dépend de l'usage que l'on souhaite en faire.

Bruno


Avatar
Christophe Lephay
Bruno Personnel wrote:
Fabien LE LEZ wrote:
La solution avec les *stream est certes plus lourde à écrire, mais
tellement plus facile à déboguer...
Oui, mais aussi embêtante quand on veut faire du formattage dynamique.

Et la c'est vrai que printf et ses dérivés reste imbattable. Donc,
ben, ca dépend de l'usage que l'on souhaite en faire.


Il faudrait préciser ce que tu entends par "formatage dynamique", parce que
les flux permettent bel et bien un formatage dynamique (via un appel de
fonction virtuelle)...

Chris