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?

¿Fue útil?

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 ints 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 que n) o -1 en caso de error codifica
  • _snprintf devuelve un valor negativo si n no es muy grande para la cadena; o n 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top