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».

DatoValor
Carpetaex01/
Archivoft_print_alphabet.c
Prototipovoid ft_print_alphabet(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 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_char internos no chocan.

El cuerpo es la llamada a write de siempre: descriptor 1, la dirección &c y un byte.

Se llama put_char y no ft_putchar para no confundirla con la función pública del ejercicio 00. Hace lo mismo, pero es privada.

void ft_print_alphabet(void)

ParteSignificado
void antes del nombreno devuelve nada
ft_print_alphabetel nombre que pide el subject
(void) entre paréntesisno 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.

Vueltaletterletter <= 'z'Qué hace
1'a'verdaderoimprime y suma
2'b'verdaderoimprime y suma
…………
26'z'verdaderoimprime y suma
—'{'falsosale 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

DetalleDecisión
Salto de línea finalno 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 infinitoimposible mientras exista letter++
26 vueltasexactas: 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íntomaCausaSolución
falta la zusaste letter < 'z'cambia a <=
el programa no terminaolvidaste letter++añádelo en el cuerpo
too many errors / tiposusaste "a" en vez de 'a'comillas simples
implicit declaration of put_chardefiniste la función después de usarlaponla 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.

Descargar