Forum Programmation.c Caractère de padding

Posté par . Licence CC by-sa
Tags : aucun
0
3
mai
2016

Bonjour,

Je cherche a écrire une chaîne avec un printf aligné à droite et un caractère de remplissage de mon choix.

printf("%*s\n",15,"toto");
           toto

Je voudrais remplacer les espaces par un caractère de mon choix.

printf("%'c*s\n",'.',15,"toto");
...........toto

Je l’ai fait avec des boucles, mais il me semblait que c’était possible… ai-je tort ?

  • # C

    Posté par . Évalué à 3. Dernière modification le 04/05/16 à 02:13.

    Dans d'autres langages y'a du sucre pour faire ça, mais en C il va falloir se contenter d’édulcorants.

    C'est pas prévu par printf, mais y'a des solutions sans boucle, genre:

    char padding[255] = { [0 ... 253] = '.', [254] = 0 }; /* ATTENTION ggc uniquement */
    printf("%.15s%s\n", padding, "hello");
    • [^] # Re: C

      Posté par . Évalué à 2.

      Du coup ma solution ressemblerait plus à :

      char padding[255] = { [0 ... 253] = '.', [254] = 0 }; /* ATTENTION ggc uniquement */
      int align = 15;
      char *str = "hello";
      printf("%.*s%s\n",align-strlen(str),padding,str);

      Merci :

      • De m’avoir confirmé l’impossibilité ;
      • De m’avoir donné un work arround.
      • [^] # Re: C

        Posté par . Évalué à 1.

        La performance est-elle critique?
        Par exemple, on peut aussi utiliser un sprintf avec comme pointeur de départ la taille de la ligne moins la taille de la chaine de caractère.
        Sachant que dans tous le cas où il y a plusieurs lignes à afficher, la ligne est réinitialisée avec le caractère de padding. De là, on peut penser à optimiser en ne réinitialisant le padding que pour les caractères modifiés précédemment, voir en concaténant les caractères de padding en une donnée dont le type est optimisé pour la machine, mais là je m'emporte…

        Il faudrait voir la performance pour chaque algorithme.

      • [^] # Re: C

        Posté par . Évalué à 1.

        Merci pour cette méthode. Débutant en C et autodidacte, je ne connaissais pas l'utilisation de l'étoile pour passer un paramètre dans le format de printf.

        Personnellement, j'écrirais :

        #define NB_CHAR 15
        #define ALIGNER_AVEC_PADDING(str) NB_CHAR - (int)strlen(str), padding, str
        
        char padding[255] = { [0 ... 253] = '.', [254] = 0 }; /* ATTENTION gcc uniquement */
        char *str = "hello";
        
        printf("%.*s%s\n",ALIGNER_AVEC_PADDING(str) );

        Qu'en pensez-vous ?

        • [^] # Re: C

          Posté par . Évalué à 2.

          Je n’aime pas l’utilisation d’une macro pour plusieurs paramètres.

          Même si c’est pas mal, on ne comprend pas tout de suite où sont les paramètres manquants, pire, si tu veux faire de la traduction et utiliser la syntaxe permettant de prendre le deuxième paramètre, puis le premier… tu risques d’avoir du mal à compter correctement.

          Le C permet de faire des choses sympas, de manière souple, mais il ne faut pas oublier la relecture par un futur collègue, ou même par toi même quand tu reviens quelques mois plus tard. Si tu passes un quart d’heure à re-comprendre alors que tu l’aurais écrit en 5 minutes de plus (je suis large), tu perds du temps globalement.

Suivre le flux des commentaires

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