Domanda

A partire da ora sto usando la riga sotto per stampare senza punti

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

Mi aspetto che l'output sia simile al seguente,

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

Come stampare trattino o punto usando fprintf / printf?

È stato utile?

Soluzione

Un approccio più veloce:

Se la massima quantità di imbottitura di cui avrai mai bisogno è nota in anticipo (che è normalmente il caso quando stai formattando una tabella a larghezza fissa come quella che hai), puoi usare un " padder " statico ; stringa e basta afferrarne un pezzo. Questo sarà più veloce di chiamare printf o cout in un ciclo.

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);

Potresti persino farlo in una sola dichiarazione, con un po 'di fiducia:

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

Altri suggerimenti

Puoi farlo facilmente con iostreams invece di printf

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

O se hai davvero bisogno di usare fprintf (diciamo, hai passato un FILE * su cui scrivere)

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

Non puoi farlo in una sola istruzione. Puoi usare sprintf, quindi sostituire i punti per gli spazi da solo o fare qualcosa come

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);

Modifica:   Ho semplificato il mio esempio sopra basato sul concetto di padder di @Ates. In questo modo non richiede alcun "salto di fiducia", sia che la stringa del tag sia troppo grande o troppo piccola - avvia sempre i dati nella colonna 41.

Dovrai produrre la stringa con il punto o il trattino che ti riempie.

Qualcosa del tipo (perdona la mia C, è arrugginito):

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

Un'altra soluzione che utilizza una piccola funzione di supporto

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

Quindi, puoi fare quanto segue:

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

Questo è essenzialmente ciò che Ates ha pubblicato, ma in realtà l'ho capito da solo;)

Suggerirei di scrivere una funzione che riempie una stringa di caratteri X e di usarla per generare il primo argomento nella stringa printf . Qualcosa del tipo:

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

Nota che la terza riga dei tuoi dati di esempio avrebbe bisogno di questo formato:

"%-40s[%s]"

Penso che ci sia un modo migliore.

#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 "));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top