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?

¿Fue útil?

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.

Editar: jj33 señala 2 errores en b y g arriba aquí.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top