Question

En C ++:

int main()
{
    cout << setfill('#') << setw(10) << 5 << endl;

    return 0;
}

Sorties:

#########5

est-il une alternative de setfill() C? Ou comment faire en C sans créer manuellement la chaîne?

Était-ce utile?

La solution

Non, il n'y a pas d'alternative directe.

Mais si vous avez un snprintf bien élevé (celui qui se comporte comme décrit par la norme C99), cela fonctionne sans créer une nouvelle chaîne; créer seulement 2 ints temporaires

#include <stdio.h>

int main(void) {
  int filler = '#'; /* setfill('#') */
  int width = 10;   /* setw(10)     */
  int target = 5;   /* 5            */

  /* ******** */
  int s = snprintf(NULL, 0, "%d", target);
  for (int i = 0; i < width - s; i++) {
    putchar(filler);
  }
  printf("%d\n", target);
  /* ******** */

  return 0;
}

EDIT:. Version en cours d'exécution à ideone


EDIT2: Différences entre la snprintf Standard C99 et Windows _snprintf ( merci pour le lien, Ben ):

  • prototype: int snprintf(char *restrict buffer, size_t n, const char *restrict format, ...);
  • prototype: int _snprintf(char *buffer, size_t n, const char *format, ...);
  • snprintf écrit pas plus de (n-1) octets et un NUL
  • _snprintf écrit au plus (n) octets, dont le dernier peut être NUL ou un autre caractère
  • snprintf retourne le nombre de caractères nécessaires pour le format (peut être plus grand que n) ou -1 en cas d'erreur de codage
  • _snprintf retourne une valeur négative si n n'est pas grand pour la chaîne; ou n si un octet NUL n'a pas été écrit à tampon.

Vous pouvez exécuter le mal se comporter _snprintf dans une boucle, augmentant n jusqu'à trouver la bonne valeur

/* absolutely not tested, written directly on SO text editor */
int i;
size_t rightvalue = 0;
char buffer[SOME_DEFAULT_VALUE];
do {
    if (sizeof buffer < rightvalue) /* OOPS, BIG BIG OOPS */;
    i = _snprintf(buffer, rightvalue, "%d", 42);
} while (i != rightvalue++);
/* rightvalue already has space for the terminating NUL */

Autres conseils

 int x= 5; 
 printf("%010d",x);

Affichera:      0000000005

Maintenant, si vous voulez vraiment « # » au lieu de « 0 » vous devrez les remplacer manuellement dans la chaîne.

Peut-être:

char buf[11], *sp = buf; 
snprintf(buf, 11, "%10d", x); 
while( (sp = strchr(sp, ' ')) != '\0'){ *sp = '#'; }
puts(buf); 

Tout le monde veut appeler printf deux fois ... printf est l'une des fonctions les plus coûteuses autour.

Ici:

char buffer[18] = "##########";
puts(buffer + snprintf(buffer+strlen(buffer), 8, "%d", 5));

Non construit en standard

Je serais probablement sprintf () le nombre à une chaîne et obtenir le nombre de caractères puis sortie le nombre correct de « # » avant d'imprimer la chaîne.

Ce qui suit va le faire en utilisant memset en C en supposant un produit de carbonisation de 1 octet. Il crée encore une « chaîne », bien que je ne suis pas sûr de savoir comment manuellement vous ne voulez pas qu'il soit.

int main(void)
{

   char buf[MAX_LENGTH];

   memset(buf, '#', 10);
   buf[10]='\0';
   printf("%s5\n", buf);
}

Selon ce que vous voulez réellement faire avec elle, vous pouvez créer dynamiquement le tampon à la taille appropriée et retour d'une fonction d'aide si vous le désirez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top