Y at-il setfill () alternative pour C?
-
28-09-2019 - |
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?
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 int
s 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 quen
) ou-1
en cas d'erreur de codage -
_snprintf
retourne une valeur négative sin
n'est pas grand pour la chaîne; oun
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.