En esta página
Ejercicio 01: ft_print_alphabet
Muestra el alfabeto en minúsculas en una sola línea, en orden creciente, empezando por la letra «a».
| Dato | Valor |
|---|---|
| Carpeta | ex01/ |
| Archivo | ft_print_alphabet.c |
| Prototipo | void ft_print_alphabet(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 el alfabeto en minusculas en una sola linea, de la 'a' a la 'z'.
** Las letras son consecutivas en ASCII, asi que basta con sumar uno.
*/
void ft_print_alphabet(void)
{
char letter;
letter = 'a';
while (letter <= 'z')
{
put_char(letter);
letter++;
}
}
Línea por línea
#include <unistd.h>
Declara write. Sin esta línea el compilador no conoce la función y, con
-Werror, el archivo no se genera. Está explicado a fondo en
el ejercicio 00.
static void put_char(char c)
Es la misma función que ft_putchar, pero con static delante. static aquí
significa: esta función solo existe dentro de este archivo. Dos motivos:
- Cada ejercicio se entrega solo, así que necesita su propia forma de escribir.
- Si compilas varios archivos juntos, dos
put_charinternos no chocan.
El cuerpo es la llamada a write de siempre: descriptor 1, la dirección
&c y un byte.
Se llama
put_chary noft_putcharpara no confundirla con la función pública del ejercicio 00. Hace lo mismo, pero es privada.
void ft_print_alphabet(void)
| Parte | Significado |
|---|---|
void antes del nombre | no devuelve nada |
ft_print_alphabet | el nombre que pide el subject |
(void) entre paréntesis | no recibe argumentos |
Sí, C usa void para dos cosas distintas: «no devuelve» y «no recibe». Aquí
aparecen las dos a la vez.
char letter;
Declara una variable de tipo char, la caja donde se guarda la letra que toca
imprimir. La declaración no le da valor: por dentro hay basura hasta que la
inicialices.
Se declara arriba del bloque porque el estilo de la piscina (basado en C89) pide todas las declaraciones al principio de la función.
letter = 'a';
Le da el primer valor. Sin esta línea, letter contendría lo que quedó de otro
programa y el bucle haría cualquier cosa.
Comillas simples: 'a' es un carácter. "a" con comillas dobles es un
string de dos bytes y no cabe en un char.
while (letter <= 'z')
Un bucle: repite su cuerpo mientras la condición sea verdadera. La condición se evalúa antes de cada vuelta.
| Vuelta | letter | letter <= 'z' | Qué hace |
|---|---|---|---|
| 1 | 'a' | verdadero | imprime y suma |
| 2 | 'b' | verdadero | imprime y suma |
| … | … | … | … |
| 26 | 'z' | verdadero | imprime y suma |
| — | '{' | falso | sale del bucle |
El <= incluye la 'z'. Con < te dejarías la última letra, que es uno de los
dos errores clásicos de este ejercicio.
put_char(letter);
Llama a la función auxiliar con el valor actual. letter se pasa por valor:
la función recibe una copia y escribirla no cambia la variable original.
letter++;
Es la forma corta de letter = letter + 1;. Avanza a la siguiente letra.
Si te olvidas de esta línea, el programa nunca termina: letter se queda en
'a' para siempre y la condición siempre es verdadera. El enunciado prohíbe el
bucle infinito de forma explícita.
Por qué funciona sin ninguna tabla
Las letras minúsculas están consecutivas en ASCII: 'a' es 97, 'b' es 98,
'c' es 99. Sumar uno a un char pasa a la siguiente. No necesitas un array ni
un if por letra.
Cuando el bucle acaba, letter vale '{', el carácter que va después de 'z'.
Ese valor no se imprime nunca: la condición se comprueba antes de entrar.
Salida esperada
abcdefghijklmnopqrstuvwxyz
Casos límite
| Detalle | Decisión |
|---|---|
| Salto de línea final | no se imprime: el enunciado pide el alfabeto, no una línea terminada |
letter <= 'z' | incluye la 'z'; con < te dejarías la última letra |
| Bucle infinito | imposible mientras exista letter++ |
| 26 vueltas | exactas: de 'a' a 'z' hay 26 letras |
Si tu corrector espera un '\n' al final, añade put_char('\n'); después del
while. Es un cambio de una línea.
Errores típicos
| Mensaje o síntoma | Causa | Solución |
|---|---|---|
falta la z | usaste letter < 'z' | cambia a <= |
| el programa no termina | olvidaste letter++ | añádelo en el cuerpo |
too many errors / tipos | usaste "a" en vez de 'a' | comillas simples |
implicit declaration of put_char | definiste la función después de usarla | ponla antes |
unused variable 'letter' | la declaraste y no la usaste | úsala en el bucle |
Comprobarlo
cat > /tmp/main.c <<'EOF'
void ft_print_alphabet(void);
int main(void)
{
ft_print_alphabet();
return (0);
}
EOF
cc -Wall -Wextra -Werror ex01/ft_print_alphabet.c /tmp/main.c -o /tmp/ex01
/tmp/ex01 | cat -A
cat -A marca el final de cada línea con $. Como no hay salto, la salida
aparece sin $ al final.