printf (parte 2)

Los placeholders de la función printf aceptan más parámetros para personalizar la forma en la que las variables son enviadas a pantalla cuando se transforman. Este vídeo contiene información adicional que puede que te interese al menos saber que existe.

Cuando trabajamos con printf en C, podemos ir mucho más allá de simplemente imprimir variables en pantalla. Aunque ya sabemos que printf procesa una cadena de caracteres y reconoce los placeholders como %i para imprimir enteros, existen modificadores que nos permiten controlar con precisión cómo se muestra la información, facilitando la lectura y el formato de la salida.

Una de las funcionalidades más curiosas es la posibilidad de cambiar el orden en que se imprimen los parámetros. Normalmente, el primer placeholder corresponde al primer argumento, el segundo al segundo, y así sucesivamente. Pero si queremos, podemos especificar explícitamente qué argumento imprimir en cada placeholder usando un número seguido de un signo de dólar, como %2$i o %1$i. Esto nos permite, por ejemplo, imprimir primero el segundo argumento y luego el primero, algo que puede ser útil en ciertos contextos, aunque no es muy común.

En cuanto a la alineación y el espacio que ocupa cada valor impreso, podemos indicar un ancho mínimo para el campo donde se mostrará la variable. Por ejemplo, si ponemos %15i, le decimos a printf que reserve 15 caracteres para imprimir ese número, alineándolo a la derecha y rellenando con espacios a la izquierda si el número es más corto. Esto es especialmente útil cuando imprimimos varias líneas con datos para que queden alineados y sean más legibles.

Si queremos que la alineación sea hacia la izquierda, basta con poner un signo menos antes del número, como %-15i. En este caso, el número se imprime alineado a la izquierda y los espacios sobrantes quedan a la derecha. Además, si en lugar de espacios queremos rellenar con ceros, podemos usar un cero delante del ancho, por ejemplo %015i, y así el espacio sobrante se rellena con ceros a la izquierda.

Cuando trabajamos con números flotantes, estos modificadores también funcionan, pero podemos añadir otro que controla la precisión decimal. Por ejemplo, %10.2f indica que queremos que el número ocupe un total de 10 caracteres, de los cuales 2 serán para la parte decimal. El punto decimal cuenta como un carácter más, por lo que la parte entera tendrá el espacio restante. Esto también hace que el número se redondee a la cantidad de decimales indicada, algo muy útil para mostrar precios o medidas con un formato uniforme.

Si solo queremos controlar la cantidad de decimales sin preocuparnos por el ancho total, podemos usar simplemente %.2f, y printf imprimirá el número con dos decimales, sin limitar el espacio total que ocupa.

Estos mismos conceptos de ancho y alineación también aplican a cadenas de caracteres. Por ejemplo, %20s imprimirá una cadena reservando 20 caracteres, alineándola a la derecha, mientras que %-20s la alineará a la izquierda.

Para controlar la presencia del signo en números, existe el modificador +. Si lo usamos, como en %+i, printf imprimirá siempre el signo, incluso para números positivos. Por defecto, los números negativos ya muestran el signo menos, pero los positivos no muestran el signo más a menos que lo indiquemos con este modificador. Podemos combinarlo con la alineación para que el signo aparezca y el número quede alineado a la izquierda, por ejemplo %+-10i.

En el ámbito de la programación de bajo nivel o cuando trabajamos con valores hexadecimales, printf nos permite imprimir números en base 16 usando %x. Si queremos que la salida incluya el prefijo 0x que indica que es hexadecimal, podemos usar el modificador #, así: %#x. Esto imprimirá, por ejemplo, 0x3039 en lugar de solo 3039.

Además, podemos combinar este modificador con el ancho y el relleno con ceros, como %#08x, que imprimirá el número hexadecimal con al menos 8 caracteres, rellenando con ceros a la izquierda y manteniendo el prefijo 0x. Hay que tener en cuenta que el prefijo cuenta dentro del ancho total, por lo que si queremos que el número hexadecimal tenga 8 caracteres sin contar el 0x, debemos ajustar el ancho sumando 2, por ejemplo %#010x.

Por último, es importante entender que algunos modificadores que parecen parte del comando en realidad son modificadores de tipo. Por ejemplo, la letra L en %ld o %li indica que la variable es un long int, no un int. Esto es un modificador que cambia el tipo de dato que printf espera para ese placeholder.

De manera similar, existe el modificador h que indica que la variable es un short int. Por ejemplo, %hd imprimirá un número interpretado como un entero corto de 16 bits. Esto puede provocar que, si el valor original es más grande, se produzca un overflow y el número impreso sea negativo o diferente, debido al casteo implícito.

Estos modificadores nos permiten adaptar la salida de printf a diferentes tipos de datos y formatos, evitando tener que escribir código adicional para formatear la salida manualmente y facilitando la presentación de datos en programas en C.

Lista de reproducción
  1. 1
    Instalar CodeBlocks
    15 minutos
  2. 2
    Funciones y hola mundo
    17 minutos
  3. 3
    Variables y tipos de datos
    17 minutos
  4. 4
    Condicionales y operadores lógicos
    16 minutos
  5. 5
    Bucles
    11 minutos
  6. 6
    Punteros
    12 minutos
  7. 7
    Arrays
    14 minutos
  8. 8
    Estructuras
    12 minutos
  9. 9
    Otras construcciones de C
    9 minutos
  10. 10
    Memoria dinámica
    8 minutos
  11. 11
    El preprocesador (parte 1)
    10 minutos
  12. 12
    El preprocesador (parte 2)
    9 minutos
  13. 13
    Archivos de cabecera y múltiples .c (parte 1)
    8 minutos
  14. 14
    Archivos de cabecera y múltiples .c (parte 2)
    9 minutos
  15. 15
    C desde la línea de comandos (parte 1)
    8 minutos
  16. 16
    C desde la línea de comandos (parte 2)
    9 minutos
  17. 17
    Break y continue
    10 minutos
  18. 18
    Goto
    13 minutos
  19. 19
    Manipulación de bits
    15 minutos
  20. 20
    Máscaras de bit
    19 minutos
  21. 21
    Archivos (1): fopen y fclose
    13 minutos
  22. 22
    Archivos (2): leer con fgetc
    9 minutos
  23. 23
    Archivos (3): fseek y ftell
    11 minutos
  24. 24
    Archivos (4): leer con fgets
    9 minutos
  25. 25
    Archivos (5): fputc y fputs
    7 minutos
  26. 26
    Archivos (6): volcar en archivos con fwrite
    10 minutos
  27. 27
    Archivos (7): fread, fwrite y los arrays
    10 minutos
  28. 28
    Archivos (8): entrada estándar y salida estándar
    9 minutos
  29. 29
    Archivos (9): buffers
    14 minutos
  30. 30
    Archivos (y 10): otras funciones útiles con archivos
    5 minutos
  31. 31
    printf (1)
    18 minutos
  32. 32
    printf (parte 2)
    12 minutos
  33. 33
    scanf (parte 1)
    17 minutos
  34. 34
    scanf (parte 2)
    17 minutos
  35. 35
    fprintf, sprintf y snprintf
    8 minutos
  36. 36
    Tipos de datos opacos
    13 minutos
  37. 37
    Bibliotecas estáticas
    13 minutos
  38. 38
    Bibliotecas dinámicas
    15 minutos
  39. 39
    Más flags: i mayúscula (include), wall, werror, pedantic...
    12 minutos
  40. 40
    pkg-config
    12 minutos
  41. 41
    Make
    17 minutos
  42. 42
    GDB
    21 minutos
  43. 43
    Variables globales
    6 minutos
  44. 44
    extern
    9 minutos
  45. 45
    Funciones variádicas
    12 minutos
  46. 46
    El optimizador de GCC y la opción -O
    12 minutos
  47. 47
    Volatile
    6 minutos