Decodificación de declaraciones printf en C (Printf Primer)
Pregunta
Estoy trabajando para llevar un código antiguo de 1998 al siglo XXI.Uno de los primeros pasos del proceso es convertir las declaraciones printf a Cadena Q variables.Sin embargo, no importa cuántas veces mire printf, siempre termino olvidando una cosa u otra.Así que, por diversión, vamos a decodificarlo juntos, por el bien de los viejos tiempos, y en el proceso creemos el primer pequeño 'cartilla printf' para desbordamiento de pila.
En el código, encontré esta pequeña joya,
printf("%4u\t%016.1f\t%04X\t%02X\t%1c\t%1c\t%4s", a, b, c, d, e, f, g);
¿Cómo se formatearán las variables a, b, c, d, e, f, g?
Solución
Danny tiene mucha razón.
a.decimal sin signo, mínimo 4 caracteres, espacio rellenado
b.coma flotante, mínimo 16 dígitos antes del decimal (rellenado con 0), 1 dígito después del decimal
C.hexadecimal, mínimo 4 caracteres, 0 relleno, las letras se imprimen en mayúsculas
d.Igual que arriba, pero mínimo 2 caracteres.
mi.Se supone que e es un int, se convierte en un carácter sin firmar y se imprime.
F.igual que e
gramo.Probablemente se trate de un error tipográfico, el 4 no tiene ningún efecto.Si fuera "%.4s", se imprimirían un máximo de 4 caracteres de la cadena.Es interesante observar que en este caso, no es necesario que la cadena termine en nulo.
Otros consejos
@día de jason, Creo que el 4 en los últimos %4 es significativo si hay menos de 4 caracteres.Si hay más de 4, tienes razón, %4s y %s serían iguales, pero con menos de 4 caracteres en g, %s estaría justificado a la izquierda y %4s estaría justificado a la derecha en un campo de 4 caracteres.
b en realidad tiene un mínimo de 16 caracteres para todo el campo, incluido el decimal y el dígito único después del decimal, creo (16 caracteres en total frente a 18 caracteres en total)
Aquí está mi manual de printf:http://www.pixelbeat.org/programming/gcc/format_specs.html
Siempre compilo con -wall con GCC que advertirá sobre cualquier desajuste entre los formatos y variables de impresión suministrados.
@jj33, tienes toda la razón, en ambos aspectos.
#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'
¡Buena atrapada!
a.decimal, cuatro dígitos significativos
b.No estoy seguro
C.hexadecimal, mínimo 4 caracteres
d.También hexadecimal, mínimo 2 caracteres
mi.1 personaje
F.Cadena de caracteres, mínimo 4
Lo que realmente necesita es una herramienta que tome las cadenas de formato en declaraciones printf() y las convierta en llamadas de función equivalentes basadas en QString.
¿Alguien quiere dedicar su tiempo de donación de software libre a desarrollar una herramienta de este tipo?
Marcador de posición para la URL de un servicio de alojamiento de software libre que contiene el código fuente de dicha herramienta