Ejercicio 06 — Contar vocales (a e i o u, mayusculas y minusculas) en una cadena…

Dificultad: amarillo · Módulo 05 (Arrays y cadenas)

Enunciado

Contar vocales (a e i o u, mayusculas y minusculas) en una cadena leida con fgets.

Diagrama de flujo

Diagrama de flujo del ejercicio 06

Cómo se resuelve

Aquí trabajamos con una cadena, que en C no es más que un array de char terminado en el carácter especial '\0' (el byte cero). Ese '\0' marca el final del texto útil.

  1. Leemos con fgets(s, sizeof(s), stdin). Usamos fgets y no gets porque fgets respeta el tamaño del buffer (sizeof(s) = 200) y nunca escribe más allá del array, evitando el desbordamiento clásico. Como efecto, fgets coloca automáticamente el '\0' al final de lo leído.
  2. Recorremos la cadena con un bucle cuya condición es s[i] != '\0'. Esta es la idea clave de las cadenas en C: no recorres “hasta una longitud”, sino hasta el terminador nulo. Cuando el bucle llega a '\0', para solo.
  3. Dentro comparamos cada carácter con las diez vocales (minúsculas y mayúsculas) usando ||, y si coincide sumamos uno al contador.

Trampa habitual: olvidar que las mayúsculas son caracteres distintos de las minúsculas ('a' y 'A' no son iguales para el ordenador), por eso hay que comprobar ambas. Y si recorrieras con un número fijo de vueltas en vez de parar en '\0', contarías basura de la memoria sobrante del array.

Para practicar — cópialo en Dev-C++

Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.

/*
 * Curso de C — Modulo 05: Arrays y cadenas
 * Ejercicio 06 — PRACTICA (rellena los TODO)
 * Enunciado: Contar vocales (a e i o u, mayusculas y minusculas) en una
 *            cadena leida con fgets.
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej06_practica.c -o ej06 && ./ej06
 */
 
#include <stdio.h>
 
int main(void) {
    char s[200];
 
    // TODO 1: Usa fgets para leer una cadena de hasta 199 caracteres.
    //         Sintaxis: fgets(s, sizeof(s), stdin);
 
    // TODO 2: Declara un contador de vocales inicializado a 0.
 
    // TODO 3: Recorre la cadena con un for cuya condicion sea s[i] != '\0'.
    //         En cada iteracion, comprueba si s[i] es una vocal
    //         (a, e, i, o, u en minuscula O en mayuscula) e incrementa el contador.
 
    // TODO 4: Imprime el numero de vocales.
 
    return 0;
}

Solución — cópiala y ejecútala

/*
 * Curso de C — Modulo 05: Arrays y cadenas
 * Ejercicio 06 — MODELO (resuelto)
 * Enunciado: Contar vocales (a e i o u, mayusculas y minusculas) en una
 *            cadena leida con fgets.
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej06_modelo.c -o ej06 && ./ej06
 */
 
#include <stdio.h>
 
int main(void) {
    char s[200];
 
    printf("Introduce una cadena: ");
    fgets(s, sizeof(s), stdin);  // lee hasta 199 chars + '\0'; incluye '\n'
 
    int vocales = 0;
 
    // Recorremos la cadena hasta encontrar '\0'
    for (int i = 0; s[i] != '\0'; i++) {
        char c = s[i];
        // Comprobamos cada vocal en mayuscula y minuscula
        if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' ||
            c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') {
            vocales++;
        }
    }
 
    printf("Vocales: %d\n", vocales);
 
    return 0;
}

Cómo usarlo

Dev-C++ (Windows): Archivo → Nuevo → Código fuente, pega el código y pulsa F11 (compilar y ejecutar). Si ves los acentos raros en la consola, escribe chcp 65001 y vuelve a ejecutar.

Conexiones