printf (1)

printf es una función que nos ha acompañado desde el primer día, pero ¿sabemos realmente cómo funciona? printf permite imprimir con formato variables por pantalla. En este capítulo hablo de los distintos placeholders que acepta printf para imprimir variables o distintos tipos de datos.

La función printf en C es una herramienta fundamental que hemos estado utilizando desde el inicio para imprimir salidas en pantalla, pero que merece una explicación más profunda para entender su verdadero potencial. A diferencia de funciones más simples como puts, printf nos permite imprimir variables con formato, lo que significa que podemos mostrar distintos tipos de datos, como enteros, caracteres, cadenas y números flotantes, de manera controlada y precisa.

Una característica clave de printf es que es una función variádica, es decir, acepta un número variable de argumentos. El primer argumento siempre es una cadena de formato que puede contener texto plano y placeholders, que son marcadores especiales que indican dónde y cómo se deben insertar los valores de las variables que pasamos a la función. Estos placeholders comienzan con el símbolo % seguido de una o varias letras que especifican el tipo de dato que queremos imprimir.

Por ejemplo, si simplemente queremos imprimir un texto fijo, podemos llamar a printf con una cadena como "Hola mundo", y la función devolverá el número de caracteres impresos, sin contar el carácter nulo que termina la cadena. Pero cuando queremos imprimir variables, usamos placeholders para indicar el tipo de dato y el lugar donde debe aparecer el valor.

El placeholder %% nos permite imprimir un símbolo de porcentaje literal, ya que % es el carácter que indica un placeholder. Para imprimir un solo carácter, usamos %c, y debemos pasar un argumento de tipo char. Por ejemplo, si tenemos una variable char letra = 'A';, podemos imprimirla con:

char letra = 'A';
printf("%c\n", letra);

Para imprimir cadenas de caracteres completas, usamos %s, que espera un puntero a una cadena terminada en \0. Esto es importante para evitar comportamientos inesperados o errores de memoria. La forma correcta de imprimir una cadena es:

char *saludo = "Hola";
printf("%s\n", saludo);

Si intentamos imprimir una cadena sin usar %s, podríamos acceder a memoria no deseada y provocar fallos.

Cuando trabajamos con números enteros, el placeholder más común es %d o %i, que imprimen enteros con signo. Por ejemplo:

int numero = -15;
printf("%d\n", numero);

Si queremos imprimir un entero sin signo, usamos %u. Esto interpreta los bits del número como un valor positivo, lo que puede resultar en números muy grandes si el valor original era negativo.

Para números enteros largos, que ocupan más espacio que un int, debemos usar %ld o %li para indicar que el argumento es un long. Esto asegura que printf interprete correctamente el tamaño del dato y evite errores.

En cuanto a los números flotantes, existen varias formas de imprimirlos según la notación que deseemos. El placeholder %f imprime el número en formato decimal estándar, con parte entera y decimal separadas por un punto. Por ejemplo:

float mi_flot = 14.56789;
printf("%f\n", mi_flot);

Si queremos imprimir en notación científica, usamos %e, que desplaza la coma decimal para que la parte entera sea un número entre 1 y 9, y añade un exponente que indica la potencia de 10 correspondiente. Por ejemplo, 1.4567e+01 representa 14.567.

Existe también %g, que elige automáticamente entre notación decimal o científica según el tamaño del número, para mantener la precisión y legibilidad.

Finalmente, para imprimir números en base hexadecimal, usamos %x para letras minúsculas y %X para mayúsculas. Esto es útil para representar valores binarios o direcciones de memoria de forma compacta. Por ejemplo:

int numero = 1234;
printf("%x\n", numero);  // imprime "4d2"
printf("%X\n", numero);  // imprime "4D2"

Estos son los placeholders más importantes que debemos conocer para usar printf con soltura. Entender cómo funcionan y qué tipo de datos esperan nos permite imprimir cualquier tipo de información de forma segura y clara, evitando errores y aprovechando al máximo esta poderosa función.

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