je cherche une solution simple et élégante pour afficher dynamiquement avec la fonction printf une série du même caractère.
je suis sur la piste suivante... (avec gettext pour la localisation (dans le fichier fr.po la chaine "Hello world" est bien sure remplacée par "Bonjour le monde")) :
char *msg = _("Hello world");
printf("\n%s", msg);
printf("\n%*c", strlen(msg), '-');
je veux éviter l'allocation dynamique (si possible)
je pense qu'une belle petite macro serait pas mal pour afficher une série de tirets mais si il y a plus propre j'achète ;)
quand pensez-vous ?
# solution de la brute
Posté par fearan . Évalué à 1.
int nbPad=strlen(pad) - strlen(msg);
if ( nbPad >= 0 ) printf("%s", pad + nbPad );
évidemment tu peux aussi connaitre la taille de ta chaine pad, ce qui évite un appel à strlen :)
Bon c'est pas l'idéal, ça impose un teste si on veux être robuste, mais ça a le mérite d'être simple. Ensuite tu peux décider que tout tes message feront au minimum 5 caractère, et grappiller sur la taille de la chaine de padding en rajoutant une constante.
Sinon tu as la solution de boucler
while(nbPad-- > 0) printf("-");
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
# avec une macro par exemple...
Posté par xylo (site web personnel) . Évalué à 2.
#define PRINT_LINE_FOR_STRING(str) do \
{ unsigned i = strlen str; \
for( ; i>0 ; --i) fputc('-',stdout); \
break; \
}while(1);
utilisation:
char *headTitle = _("Classes extraction available:");
fprintf(stdout, "\n%s", headTitle);
fprintf(stdout, "\n");
PRINT_LINE_FOR_STRING((headTitle));
# Aaah ! STRING$
Posté par Obsidian . Évalué à 2.
Voici ce que je te propose :
const char * chrstr (const char c,unsigned int l)
{
static unsigned int length = 0;
static char * buffer = NULL;
++l; // Pour le '\0' final.
if (l != length && buffer != NULL)
{
free (buffer);
buffer = NULL;
}
buffer = (char *) malloc(l);
if (buffer)
{
buffer [--l]='\0';
while (l) buffer [--l]=c;
}
return (const char *)buffer;
}
Alors, oui, c'est de l'allocation dynamique, mais au moins on ne garde en mémoire que la dernière chaîne générée, et c'est compatible avec printf(). Tu peux faire un chrstr('x',0); si tu veux libérer le maximum de mémoire, et tu peux même te permettre de faire un free() sur le pointeur si tu es sûr de ne plus jamais rappeler la fonction derrière ...
[^] # Re: Aaah ! STRING$
Posté par xylo (site web personnel) . Évalué à 1.
version plus efficace... et commentée.
merci quand même pour ta réponse Obsidian mais je voulais faire plus simple sans alloc...
const char *chrstr( const char c, unsigned int l)
{
static unsigned int length = 0;
static char * buffer = NULL;
// par convention si l == 0 on souhaite dallouer le buffer
// si il existe
if( 0 == l && buffer != NULL) {
#if defined(DEBUG)
fprintf(stdout, "\nDEBUG: on souhaite simplement faire du mnage. (Buffer[0x%x])", buffer);
#endif
free(buffer); buffer = NULL; goto BAIL;
}
++l; // Pour le '\0' final.
if( l > length && buffer != NULL) {
#if defined(DEBUG)
fprintf(stdout, "\nDEBUG: le buffer allou est trop petit. (Buffer[0x%x])", buffer);
#endif
free (buffer);
buffer = NULL;
}
#if defined(DEBUG)
else {
fprintf(stdout, "\nDEBUG: pas de rallocation ncessaire. (Buffer[0x%x])", buffer);
}
#endif
if( NULL == buffer) {
length = l;
buffer = (char *) calloc( l, sizeof(char));
#if defined(DEBUG)
fprintf(stdout, "\nDEBUG: allocation d'un nouveau buffer[0x%x].", buffer);
#endif
}
if( NULL != buffer) {
buffer[--l] = '\0';
while(l) buffer[--l] = c;
}
BAIL:
return (const char *)buffer;
}
[^] # Re: Aaah ! STRING$
Posté par Obsidian . Évalué à 2.
Oups ! Oubli de ma part, désolé. Je l'ai écrit à l'arrache avant d'aller prendre le train ...
[^] # Re: Aaah ! STRING$
Posté par Nicolas Boulay (site web personnel) . Évalué à 3.
"La première sécurité est la liberté"
[^] # Re: Aaah ! STRING$
Posté par Obsidian . Évalué à 2.
[^] # Re: Aaah ! STRING$
Posté par Nicolas Boulay (site web personnel) . Évalué à 3.
et éviter de passer par plusieurs appels successifs.
Si c'est pour une raison de performance, j'espère que tu plaisantes!
"La première sécurité est la liberté"
[^] # Re: Aaah ! STRING$
Posté par Obsidian . Évalué à 2.
Heureux ?
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.