2008-08-11 13 views
4

Je travaille sur l'introduction d'un ancien code de 1998 au 21ème siècle. L'une des premières étapes du processus consiste à convertir les instructions printf en variables QString. Peu importe combien de fois je regarde printf, je finis toujours par oublier une chose ou l'autre. Donc, pour le plaisir, décodons ensemble, pour l'éternité et par la même occasion créer le premier petit 'printf primer' pour Stackoverflow.Décoder les instructions printf en C (Printf Primer)

Dans le code, je suis tombé sur ce petit bijou,

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

Comment les variables a, b, c, d, e, f, g formater?

Répondre

5

Danny a pour la plupart raison.

a. décimal non signé, minimum 4 caractères, espace rembourré
b. virgule flottante, minimum 16 chiffres avant la virgule (0 bourré), 1 chiffre après la virgule
c. hex, minimum 4 caractères, 0 rembourré, les lettres sont imprimées en majuscule
d. comme ci-dessus, mais au moins 2 caractères
e. e est supposé être un int, converti en un caractère non signé et imprimé
f. identique à e
g. C'est probablement une faute de frappe, le 4 n'a aucun effet. Si c'était "% .4s", alors un maximum de 4 caractères de la chaîne seraient imprimés. Il est intéressant de noter que dans ce cas, la chaîne n'a pas besoin d'être terminée par un caractère nul.

Édition: jj33 signale 2 erreurs en b et g au-dessus de here.

+0

Pour 'g', le 4 a un effet: si la chaîne est plus courte que 4 caractères, il sera l'espace- rembourré (à gauche). –

0

a. décimal, quatre chiffres significatifs

b. Incertain

c. hex, minimum 4 caractères

d. Également hex, minimum 2 caractères

e. 1 caractère

f. Chaîne de caractères, minimum 4

5

@Jason Day, je pense que le 4 dans le dernier% 4s est significatif s'il y a moins de 4 caractères. S'il y a plus de 4 vous avez raison,% 4s et% s seraient les mêmes, mais avec moins de 4 caractères dans g% s serait justifié à gauche et% 4s serait justifié à droite dans un champ à 4 caractères.

b est en fait 16 caractères minimum pour le champ entier, y compris la virgule et le seul chiffre après la virgule, je pense (16 au total contre 18 caractères total) caractères

3

@ jj33, vous êtes tout à fait raison, sur les deux comptent.

#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' 

Bonne prise!

4

Voici mon primaire printf: http://www.pixelbeat.org/programming/gcc/format_specs.html

toujours je compile -Wall avec gcc qui va mettre en garde contre les discordances entre les formats fournis et les variables printf.

+0

Je suis tombé au hasard sur cette amorce mois et immédiatement mis en signet. Je l'ai utilisé un peu depuis lors. Merci d'avoir pris le temps de le mettre ensemble! – SiegeX

0

Ce dont vous avez réellement besoin, c'est d'un outil qui prend les chaînes de format dans les instructions printf() et les convertit en appels de fonction QString équivalents.
Quelqu'un veut-il consacrer son Temps de Don de Logiciel Libre au développement d'un tel outil?

Placeholder pour l'URL d'un service d'hébergement de logiciel libre contenant le code source d'un tel outil

+1

Ou vous pouvez utiliser QString :: sprintf qui fait partie de la classe QString et "prend en charge la plupart des spécificateurs de conversion fournis par printf() dans la bibliothèque C++ standard." –

Questions connexes