En esta página

Ejercicio 03: ft_print_numbers

Muestra, en una sola línea y en orden creciente, todos los dígitos.

DatoValor
Carpetaex03/
Archivoft_print_numbers.c
Prototipovoid ft_print_numbers(void);
Funciones autorizadassolo write

Hecho con amor para Laura, por Bogdan.

El archivo

#include <unistd.h>

/*
** Copia local de ft_putchar: el enunciado solo permite entregar este archivo.
** Escribe un unico caracter en la salida estandar.
*/
static void put_char(char c)
{
    write(1, &c, 1);
}

/*
** Muestra los diez digitos en orden creciente, en una sola linea.
** Los digitos tambien son consecutivos en ASCII: '0' + 1 es '1'.
*/
void    ft_print_numbers(void)
{
    char    digit;

    digit = '0';
    while (digit <= '9')
    {
        put_char(digit);
        digit++;
    }
}

Línea por línea

#include <unistd.h>

Declara write. Sin ella, -Werror corta la compilación con implicit declaration of function 'write'.

static void put_char(char c)

La misma copia privada de ft_putchar que usan los ejercicios 01 y 02. static evita que choque con la función pública si algún día compilas varios archivos juntos.

void ft_print_numbers(void)

No devuelve nada y no recibe parámetros. Es la firma que pide el enunciado.

char digit;

Guarda el dígito que toca imprimir. char es suficiente: solo hay diez valores posibles, de '0' a '9'.

digit = '0';

Arranca en el primer dígito. '0' es un carácter, no el número 0. Su código ASCII es 48. Esa distinción es la clave de todo el ejercicio.

while (digit <= '9')

Diez vueltas, de '0' a '9'. El <= incluye el último dígito; con < se quedaría en el 8.

put_char(digit);

Escribe el carácter actual. Lo que se imprime es digit tal cual, no una conversión: ya es un carácter.

digit++;

Avanza al siguiente dígito. Los códigos de '0' a '9' son consecutivos (48 a 57), así que sumar uno da el siguiente carácter.

La conversión que vas a reutilizar

Este ejercicio parece trivial, pero esconde la operación que necesitan los ejercicios 06, 07 y 08:

put_char('0' + number);   /* 0 → '0', 7 → '7' */

Funciona porque la distancia entre '0' y '9' es la misma que entre 0 y 9. No es magia: '0' vale 48, y 48 + 7 es 55, que es '7'.

Ese truco no se generaliza a cualquier número. '0' + 42 no da una letra: da otro carácter. Para números de varias cifras hay que separarlas con / y %, como hace el ejercicio 06.

Salida esperada

0123456789

Casos límite

DetalleDecisión
Salto de línea finalno se imprime
digit <= '9'incluye el 9; con < te dejarías el último dígito
Diez vueltasexactas: no hay dígitos fuera de '0'–'9'
Usar int en vez de chartambién funcionaría, pero sobra memoria

Errores típicos

Mensaje o síntomaCausaSolución
imprime símbolos rarosempezaste en 0 en vez de '0'usa el carácter
falta el 9usaste digit < '9'cambia a <=
no terminaolvidaste digit++añádelo en el cuerpo
no compiladigit = "0" con comillas doblescomillas simples

Comprobarlo

cat > /tmp/main.c <<'EOF'
void    ft_print_numbers(void);

int main(void)
{
    ft_print_numbers();
    return (0);
}
EOF
cc -Wall -Wextra -Werror ex03/ft_print_numbers.c /tmp/main.c -o /tmp/ex03
/tmp/ex03

Descargar