Skip to content

ft_puthex

Marcos edited this page Oct 6, 2024 · 2 revisions

La función ft_puthex se encarga de imprimir un número en formato hexadecimal. Dependiendo del valor del parámetro format, el número se imprimirá en minúsculas (x) o mayúsculas (X). Esta función se utiliza en el proyecto ft_printf para manejar especificadores de formato hexadecimales.

Enlace al código original

Implementación

Inclusión de la Cabecera

#include "ft_printf.h"

Se incluye el archivo de cabecera ft_printf.h para acceder a las funciones declaradas.

Función ft_puthex

int ft_puthex(unsigned int num, char format)

Parámetros:

  • unsigned int num: El número que se desea imprimir en formato hexadecimal.
  • char format: Especifica si el número se imprimirá en minúsculas ('x') o mayúsculas ('X').

Código Comentado

Aquí está el código completo con comentarios para facilitar su comprensión:

#include "ft_printf.h"

/*
 * Esta función imprime un número en formato hexadecimal.
 * Dependiendo del valor de 'format', imprime en minúsculas ('x') o mayúsculas ('X').
 */

int	ft_puthex(unsigned int num, char format)
{
    // Variable que almacenará el número de caracteres impresos
	int		count;
    // Variable para almacenar los dígitos hexadecimales
	char	*hex_digits;

    // Inicializamos 'count' en 0
	count = 0;

    // Asignamos los dígitos hexadecimales según el formato ('x' o 'X')
	if (format == 'x')
		hex_digits = "0123456789abcdef"; // Minúsculas
	else if (format == 'X')
		hex_digits = "0123456789ABCDEF"; // Mayúsculas
	else
		return (-1); // Si el formato no es válido, retornamos un error

    // Si el número es mayor o igual a 16, realizamos la conversión recursiva
	if (num >= 16)
	{
        // Llamada recursiva para imprimir la parte alta del número
		count += ft_puthex(num / 16, format);
        // Llamada recursiva para imprimir la parte baja del número
		count += ft_puthex(num % 16, format);
	}
	else
	{
        // Si el número es menor a 16, imprimimos el dígito hexadecimal correspondiente
		count += ft_putchar(hex_digits[num]);
	}

    // Retornamos el número total de caracteres impresos
	return (count);
}

Funcionamiento:

  1. Selección del formato: Según el valor del parámetro format, se selecciona si el número se imprimirá en minúsculas ("0123456789abcdef") o mayúsculas ("0123456789ABCDEF").
  2. Conversión recursiva: Si el número es mayor o igual a 16, la función se llama a sí misma para dividir el número en partes más pequeñas, dividiendo por 16 y usando el resto para obtener el dígito hexadecimal.
  3. Impresión del dígito: Cuando el número es menor a 16, se imprime el dígito hexadecimal correspondiente, utilizando la función ft_putchar.
  4. Conteo: Se lleva un registro de la cantidad de caracteres impresos, que es el valor devuelto por la función.

Explicación Paso a Paso de la Recursión

Para entender mejor el funcionamiento de este bloque:

if (num >= 16)
{
    count += ft_puthex(num / 16, format);
    count += ft_puthex(num % 16, format);
}
else
{
    count += ft_putchar(hex_digits[num]);
}

Veamos un ejemplo con un número específico, por ejemplo, num = 254 (que en hexadecimal es fe).

  1. Primera llamada a ft_puthex(254, 'x'):

    • num es mayor o igual a 16, por lo que entramos en la rama recursiva.
    • Dividimos:
      • num / 16 = 254 / 16 = 15 (parte entera, corresponde a 'f' en hexadecimal).
      • num % 16 = 254 % 16 = 14 (corresponde a 'e' en hexadecimal).
    • Llamamos a ft_puthex(15, 'x') y luego a ft_puthex(14, 'x').
  2. Segunda llamada a ft_puthex(15, 'x'):

    • num es menor a 16, por lo que no entramos en la recursión.
    • El número 15 corresponde a 'f' en el string hex_digits = "0123456789abcdef".
    • Llamamos a ft_putchar('f') y sumamos 1 al contador.
  3. Tercera llamada a ft_puthex(14, 'x'):

    • num es menor a 16, por lo que no entramos en la recursión.
    • El número 14 corresponde a 'e' en el string hex_digits = "0123456789abcdef".
    • Llamamos a ft_putchar('e') y sumamos 1 al contador.

Resumen del proceso:

  1. Primera llamada: ft_puthex(254, 'x') → Recursión con ft_puthex(15, 'x') y ft_puthex(14, 'x').
  2. Segunda llamada: ft_puthex(15, 'x') → Imprime 'f'.
  3. Tercera llamada: ft_puthex(14, 'x') → Imprime 'e'.

En resumen, la secuencia es:

  • Primero se imprime 'f' y luego 'e', resultando en la cadena "fe".

Clone this wiki locally