Pregunta

A partir de ahora estoy usando la línea de abajo para imprimir sin puntos

fprintf( stdout, "%-40s[%d]", tag, data);

Espero que el resultado sea algo como lo siguiente,

Number of cards..................................[500]
Fixed prize amount [in whole dollars]............[10]
Is this a high winner prize?.....................[yes]

¿Cómo imprimir un guión o un punto usando fprintf / printf?

¿Fue útil?

Solución

Un enfoque más rápido:

Si se conoce de antemano la cantidad máxima de relleno que necesitará (que normalmente es el caso cuando formatea una tabla de ancho fijo como la que tiene), puede usar un " padder " estático ; cuerda y solo agarrar un trozo de ella. Esto será más rápido que llamar a printf o cout en un bucle.

static const char padder[] = "......................"; // Many chars

size_t title_len = strlen(title);
size_t pad_amount = sizeof(padder) - 1 - title_len;

printf(title); // Output title

if (pad_amount > 0) {
    printf(padder + title_len); // Chop!
}

printf("[%d]", data);

Incluso podría hacerlo en una sola declaración, con un poco de fe:

printf("%s%s[%d]", title, padder + strlen(title), data);

Otros consejos

Puede hacerlo fácilmente con iostreams en lugar de printf

cout << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl;

O si realmente necesita usar fprintf (por ejemplo, se le pasa un ARCHIVO * para escribir)

strstream str;
str << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl;
printf(%s", str.str());

No puedes hacerlo en una sola declaración. Puede usar sprintf, luego sustituir los puntos por espacios usted mismo, o hacer algo como

int chars_so_far;
char padder[40+1]= '..........'; //assume this is 40 dots.
printf("%.40s%n",tag,&chars_so_far);
printf("%s[%d]",padder+chars_so_far,data);

Editar:   Simplifiqué mi ejemplo anterior basado en el concepto de padder de @Ates. De esta manera no se requieren "saltos de fe", sobre si la cadena de la etiqueta es demasiado grande o demasiado pequeña; siempre comienza los datos en la columna 41.

Tendrá que dar salida a la cadena con el punto o el relleno del tablero usted mismo.

Algo así como (perdona mi C, está oxidado):

printAmount(char *txt, int amt) {
    printf("%s",txt);
    for(int xa=strlen(txt); xa<40; xa++) { putc('.'); }
    printf("[%d]",amt);
    printf("\n");
    }

Otra solución usando una pequeña función auxiliar

static inline size_t min(size_t a, size_t b)
{
    return a < b ? a : b;
}

Luego, puede hacer lo siguiente:

char padder[] = "........................................";
int len = min(strlen(tag), sizeof(padder) - 1);
printf("%.*s%s[%d]", len, tag, padder + len, data);

Esto es esencialmente lo que Ates publicó, pero en realidad lo descubrí por mi cuenta;)

Sugeriría escribir una función que rellene una cadena con caracteres X y usarla para generar el primer argumento de su cadena printf . Algo así como:

char s[40];
pad_str(tag, s, 40, '.');
fprintf( stdout, "%-40s[%d]", s, data);

Tenga en cuenta que la tercera línea de sus datos de muestra necesitaría este formato:

"%-40s[%s]"

Creo que hay una mejor manera.

#include <string.h>
#include <stdio.h>

#define MIN(A,B) ((A)<(B)?(A):(B))
char *dashpad(char *buf, int len, const char *instr) {
    memset(buf, '-', len);
    buf[len] = 0;
    int inlen = strlen(instr);
    memcpy(buf, instr, MIN(len, inlen));
    return buf;
}
main() {
    char buf[40];
    printf("%s\n", dashpad(buf, 40, "Hello world, dash padded "));
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top