Domanda

Sto lavorando per riportare alcuni vecchi codici dal 1998 al 21° secolo.Uno dei primi passaggi del processo è convertire le istruzioni printf in QString variabili.Non importa quante volte ripenso a printf, finisco sempre per dimenticare una cosa o l'altra.Quindi, per divertimento, decodifichiamolo insieme, per il bene dei vecchi tempi, e nel frattempo creiamo il primo piccolo 'primer printf' per StackOverflow.

Nel codice mi sono imbattuto in questo piccolo gioiello,

printf("%4u\t%016.1f\t%04X\t%02X\t%1c\t%1c\t%4s", a, b, c, d, e, f, g);

Come verranno formattate le variabili a, b, c, d, e, f, g?

È stato utile?

Soluzione

Danny ha quasi ragione.

UN.decimale senza segno, minimo 4 caratteri, spazio riempito
B.virgola mobile, minimo 16 cifre prima del decimale (0 riempito), 1 cifra dopo il decimale
C.esadecimale, minimo 4 caratteri, 0 riempito, le lettere sono stampate in maiuscolo
D.come sopra, ma minimo 2 caratteri
e.Si presuppone che e sia un int, convertito in un carattere senza segno e stampato
F.lo stesso di e
G.Probabilmente è un errore di battitura, il 4 non ha alcun effetto.Se fosse "%.4s", verrebbero stampati al massimo 4 caratteri della stringa.È interessante notare che in questo caso non è necessario che la stringa termini con un null.

Modificare: jj33 sottolinea 2 errori in b e g sopra Qui.

Altri suggerimenti

@Jason Giorno, penso che il 4 negli ultimi %4 sia significativo se ci sono meno di 4 caratteri.Se ce ne sono più di 4 hai ragione, %4s e %s sarebbero uguali, ma con meno di 4 caratteri in g %s sarebbe giustificato a sinistra e %4s sarebbe giustificato a destra in un campo di 4 caratteri.

b è in realtà un minimo di 16 caratteri per l'intero campo, incluso il decimale e la singola cifra dopo il decimale, credo (16 caratteri totali contro 18 caratteri totali)

Ecco il mio primer printf:http://www.pixelbeat.org/programming/gcc/format_specs.html

Ho sempre compilato con -wall con GCC che avvertirà di eventuali disallineamenti tra i formati di stampa e le variabili forniti.

@jj33, hai assolutamente ragione, su entrambi i fronti.

#include <stdio.h>

int main(int argc, char *argv[]) {
    char *s = "Hello, World";
    char *s2 = "he";

    printf("4s: '%4s'\n", s);
    printf(".4s: '%.4s'\n", s);
    printf("4s2: '%4s'\n", s2);
    printf(".4s2: '%.4s'\n", s2);

    return 0;
}

$ gcc -o foo foo.c
$ ./foo
4s: 'Hello, World'
.4s: 'Hell'
4s2: '  he'
.4s2: 'he'

Buona pesca!

UN.decimale, quattro cifre significative

B.Non è sicuro

C.esadecimale, minimo 4 caratteri

D.Anche esadecimale, minimo 2 caratteri

e.1 carattere

F.Stringa di caratteri, minimo 4

Ciò di cui hai veramente bisogno è uno strumento che prenda le stringhe di formato nelle istruzioni printf() e le converta in chiamate di funzioni equivalenti basate su QString.
Qualcuno vuole spendere il suo tempo per donare software libero allo sviluppo di uno strumento del genere?

Segnaposto per l'URL di un servizio di hosting di software libero che contiene il codice sorgente di tale strumento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top