Decodarea declarațiilor printf în C (Printf Primer)

Lucrez la aducerea unui cod vechi de la 1998 până la secolul 21. Unul din primii pași în proces este conversia instrucțiunilor printf la QString variabile. Nu contează de câte ori mă uit înapoi la printf, totuși, întotdeauna termin să uit un lucru sau altul. Așadar, pentru distracție, să o decodificăm împreună, timp de câteva ori și în acest proces să creați primul mic 'printf primer' pentru Stackoverflow.

În cod, am dat peste această bijuterie mică,

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

Cum vor fi formatate variabilele a, b, c, d, e, f, g?

0
fr hi bn

6 răspunsuri

Danny are în mare parte dreptate.

A. zecimal nesemnat, minim 4 caractere, spațiu cromat
b. punct de plată, minimum 16 cifre înaintea zecimal (0 căptușit), 1 cifră după zecimale c. hexazecimal, minimum 4 caractere, cu litere căptușite, literele sunt tipărite cu majuscule d. la fel ca mai sus, dar minim 2 caractere e. e este presupus a fi un int, convertit la un caracter nesemn și imprimat f. la fel ca e g. Aceasta este probabil o tipo, 4 nu are efect. Dacă au fost "% .4s", atunci s-ar imprima maxim 4 caractere din șir. Este interesant de observat că în acest caz, șirul nu trebuie să fie terminat.

Editați: jj33 arată două erori în b și g de mai sus aici .

0
adăugat
Pentru g , efectul 4 are un efect: dacă șirul este mai mic de 4 caractere, acesta va fi căptușit cu spațiu (în stânga).
adăugat autor R.., sursa

@ jj33, ai absolut dreptate, în ambele cazuri.

#include 

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'

Buna captura!

0
adăugat

Here's my printf primer: http://www.pixelbeat.org/programming/gcc/format_specs.html

Întotdeauna compilați cu -Wall cu gcc care va avertiza despre eventualele neconcordanțe între cele furnizate formatele printf și variabilele.

0
adăugat
Am întâmpinat întâmplător întâmplător acest anstruct cu câteva luni în urmă și am marcat imediat. Am folosit-o destul de mult de atunci. Vă mulțumim că ați făcut timp pentru a pune împreună!
adăugat autor SiegeX, sursa

A. zecimal, patru cifre semnificative

b. Nu sunt sigur

c. hex, minimum 4 caractere

d. De asemenea, hex, minimum 2 caractere

e. 1 caracter

f. String de caractere, minim 4

0
adăugat

@ Jason Day , cred că cele 4 din ultimele% 4s este semnificativ dacă există mai puțin de 4 caractere. Dacă aveți mai mult de 4 dreptate,% 4s și% s ar fi aceleași, dar cu mai puțin de 4 caractere în g% s ar fi justificate la stânga și% 4s ar fi justificate în dreapta într-un câmp de 4 caractere.

b este de fapt minimum 16 caractere pentru întregul câmp, inclusiv zecimală și cifra unică după zecimă Cred că (16 caractere totale vs 18 caractere totale)

0
adăugat

Ce ai cu adevărat nevoie este un instrument care ia șirurile de formate din instrucțiunile printf() și le transformă în apeluri funcționale bazate pe QString. Vrea cineva să-și petreacă timpul de donare a software-ului gratuit pentru dezvoltarea unui astfel de instrument?

Placeholder pentru URL-ul unui serviciu de găzduire a software-ului gratuit care deține codul sursă al unui astfel de instrument

0
adăugat
Sau puteți utiliza QString :: sprintf care face parte din clasa QString și "suportă majoritatea specificatoarelor de conversie furnizate de printf() în biblioteca standard C ++".
adăugat autor David Dibben, sursa