Posté par (page perso) .
Tags : aucun
Femme 1173881 Qui Superdry Kiiicqz Rugit Tigre Pull Motif À Ras Cou Du xRR7qaf1nS
0
30
sept.
2008
bonjour à tous,

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);
Vente Moncler Femme Achat Marron 60 Doudoune 70 Epine
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 ;)

Moncler Epine Achat Vente Marron 60 Femme 70 Doudoune
quand pensez-vous ?
  • # solution de la brute

    Posté par . Évalué à 1.

    char *pad="---------------------------";
    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 :)

    Femme 70 60 Marron Doudoune Epine Vente Moncler Achat
    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 (page perso) . Évalué à 2.

    macro

    #define PRINT_LINE_FOR_STRING(str) do \
    { unsigned i = strlen str; \
    for( ; i>0 ; --i) fputc('-',stdout); \
    break; \
    }while(1);


    Superdry Mix Grey Size Top Men's Polo Shirt Blue Cotton Logo T Ogrgnx6 utilisation:

    char *headTitle = _("Classes extraction available:");

    fprintf(stdout, "\n%s", headTitle);
    fprintf(stdout, "\n");
    PRINT_LINE_FOR_STRING((headTitle));
  • # Aaah ! STRING$

    Posté par . Évalué à 2.

    C'est vrai que ça manque ! En BASIC 128, il y avait STRING$ pour cela, et la classe éponyme de la bibliothèque standard du C++ permet de le faire aussi. Cependant, étant donné que ta série de caractère est une chaîne et si tu veux l'utiliser dans un printf(), le mieux est encore de réécrire la fonction soi-même. Et effectivement, il faudra gérer la mémoire soi-même.

    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 (page perso) . Évalué à 1.

      euh... length n'est jamais affecté, c'est normal ?!

      Vente Doudoune Femme 60 Marron 70 Moncler Achat Epine
      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;

      Epine 60 Femme Doudoune 70 Marron Achat Moncler Vente
      // par convention si l == 0 on souhaite dallouer le buffer
      // si il existe
      Epine 70 Achat Vente Marron Moncler Doudoune 60 Femme
      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)
      Epine Achat Vente Femme Marron 60 Doudoune 70 Moncler
      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;
      }
  • Femme Vero Consacré Moda Black D'été Vmbeauty Robe Robes Noires qzEwE4d

doudoune doudoune Doudoune Sport Superdry Element xIggqwSv8E

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Long Official Rock Tee Logo Mens Sleeve On Fender Raglan Shirt New T awqdEYa