¿Hay alguna setfill () alternativa para C?
-
28-09-2019 - |
Pregunta
En C ++:
int main()
{
cout << setfill('#') << setw(10) << 5 << endl;
return 0;
}
Salidas:
#########5
¿Hay alguna alternativa setfill()
para C? O cómo hacer esto en C sin crear manualmente la cadena?
Solución
No, no hay otra alternativa directa.
Pero si tiene un buen comportamiento snprintf
(uno que se comporta como se describe en la norma C99), esto funciona sin necesidad de crear una nueva cadena; la creación de sólo 2 int
s temporales
#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:. Ejecuta la versión en Ideone
Edit2: Diferencias entre snprintf
del estándar C99 y _snprintf
de Windows ( Gracias por el enlace, Ben ):
- prototipo:
int snprintf(char *restrict buffer, size_t n, const char *restrict format, ...);
- prototipo:
int _snprintf(char *buffer, size_t n, const char *format, ...);
-
snprintf
no más escribe de (n-1) bytes y un NUL -
_snprintf
no más de lo escribe (n) bytes, el último de los cuales pueden ser NUL u otro carácter -
snprintf
devuelve el número de caracteres necesarios para el formato (puede ser más grande quen
) o-1
en caso de error codifica -
_snprintf
devuelve un valor negativo sin
no es muy grande para la cadena; on
si un byte NUL no se ha escrito a la memoria intermedia.
Puede ejecutar el _snprintf
mal comportarse en un bucle, aumentando n
hasta encontrar el valor correcto
/* 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 */
Otros consejos
int x= 5;
printf("%010d",x);
es la salida: 0000000005
Ahora bien, si usted realmente quiere '#' en lugar de '0' que tendrá que reemplazar manualmente en la cadena.
Tal vez:
char buf[11], *sp = buf;
snprintf(buf, 11, "%10d", x);
while( (sp = strchr(sp, ' ')) != '\0'){ *sp = '#'; }
puts(buf);
Todo el mundo quiere llamar printf
dos veces ... printf
es una de las funciones más caros de todo.
A continuación:
char buffer[18] = "##########";
puts(buffer + snprintf(buffer+strlen(buffer), 8, "%d", 5));
No incorporado de serie
Yo probablemente sprintf () el número en una cadena y obtener el recuento de caracteres entonces la salida el número correcto de '#' antes de imprimir la cadena.
La siguiente lo hará usando memset
en C asumiendo un char de 1 byte. Todavía crea una 'cadena', aunque no estoy seguro de cómo manualmente que no quiere que sea.
int main(void)
{
char buf[MAX_LENGTH];
memset(buf, '#', 10);
buf[10]='\0';
printf("%s5\n", buf);
}
En función de lo que quiere hacer en realidad con él, usted podría crear dinámicamente la memoria intermedia a ser del tamaño apropiado y volverlo a partir de una función de ayuda si así lo desea.