En esta página
Ejercicio 03: ft_print_numbers
Muestra, en una sola línea y en orden creciente, todos los dígitos.
| Dato | Valor |
|---|---|
| Carpeta | ex03/ |
| Archivo | ft_print_numbers.c |
| Prototipo | void ft_print_numbers(void); |
| Funciones autorizadas | solo 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
| Detalle | Decisión |
|---|---|
| Salto de línea final | no se imprime |
digit <= '9' | incluye el 9; con < te dejarías el último dígito |
| Diez vueltas | exactas: no hay dígitos fuera de '0'–'9' |
Usar int en vez de char | también funcionaría, pero sobra memoria |
Errores típicos
| Mensaje o síntoma | Causa | Solución |
|---|---|---|
| imprime símbolos raros | empezaste en 0 en vez de '0' | usa el carácter |
falta el 9 | usaste digit < '9' | cambia a <= |
| no termina | olvidaste digit++ | añádelo en el cuerpo |
| no compila | digit = "0" con comillas dobles | comillas 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