Menu
Coddy logo textTech

Función para mostrar un contacto

Parte de la sección Logic & Flow del Journey de C de Coddy — lección 53 de 63.

challenge icon

Desafío

Fácil

Basándote en tu sistema de gestión de contactos de las lecciones anteriores, crea una función que muestre la información del contacto de forma formateada. Esta lección introduce tres nuevas funciones de cadena que necesitarás: fgets(), strcspn() y strchr() — cada una se explica a continuación antes de los requisitos.

Nuevas funciones utilizadas en esta lección:

  • fgets(buffer, size, stdin) — lee una línea de entrada incluyendo espacios (a diferencia de scanf, que se detiene en los espacios en blanco). Almacena la entrada en buffer, leyendo como máximo size - 1 caracteres. También almacena el carácter de nueva línea '\n' al final.
  • strcspn(str, "\n") — devuelve el índice de la primera aparición de '\n' en str. Se utiliza para eliminar el salto de línea final dejado por fgets: str[strcspn(str, "\n")] = '\0';
  • strchr(str, ch) — busca el carácter ch en str y devuelve un puntero a su ubicación, o NULL si no se encuentra.

Tu programa debe:

  1. Utilizar la misma definición de struct Contact de las lecciones anteriores con los miembros:
    • Un arreglo de caracteres name con tamaño 50
    • Un arreglo de caracteres phone con tamaño 20
    • Un arreglo de caracteres email con tamaño 40
    • Un entero age
  2. Utilizar la misma función createContact de las lecciones anteriores que:
    • Asigne dinámicamente memoria para un struct Contact
    • Inicialice todos los miembros con valores por defecto
    • Devuelva un puntero al contacto
  3. Escribir una función populateContact que:
    • Tome un puntero a un struct Contact como parámetro
    • Use fgets() para leer cada campo de cadena (nombre, teléfono, correo electrónico) para que se acepten nombres con espacios
    • Use strcspn() para eliminar el salto de línea final de cada campo de cadena después de leerlo
    • Use scanf("%d", ...) para leer el campo entero de edad
    • Nota: Esta versión de populateContact no incluye la validación de la longitud del número de teléfono; no la agregues, ya que las entradas de prueba utilizan números de teléfono cortos como 555-1234
  4. Escribir una función llamada displayContact que:
    • Tome un puntero constante a un struct Contact como parámetro: const struct Contact *contactPtr
    • No devuelva nada (void)
    • Imprima la información del contacto en este formato exacto:
      • === CONTACT DETAILS ===
      • Name: [name]
      • Phone: [phone]
      • Email: [email]
      • Age: [age] years old
      • ========================
    • Después de mostrar la información básica, calcule y muestre detalles adicionales:
      • Calcule la longitud del nombre usando strlen() e imprima: Name length: [length] characters
      • Determine la categoría de generación basada en la edad e imprima:
        • Si la edad está entre 0 y 12: Generation: Child
        • Si la edad está entre 13 y 19: Generation: Teenager
        • Si la edad está entre 20 y 39: Generation: Young Adult
        • Si la edad está entre 40 y 59: Generation: Middle-aged Adult
        • Si la edad es 60 o superior: Generation: Senior
      • Verifique si el correo electrónico contiene el carácter '@' usando strchr() e imprima:
        • Si se encuentra '@': Email format: Valid
        • Si no se encuentra '@': Email format: Invalid
  5. En la función main:
    • Crea un contacto usando la función createContact
    • Verifica si la creación del contacto fue exitosa
    • Llama a la función populateContact para completar los datos del contacto
    • Llama a la función displayContact para mostrar la información del contacto formateada
    • Libera la memoria asignada dinámicamente
    • Imprime Program completed successfully

Este desafío demuestra cómo crear una función de visualización que toma un puntero constante a un struct, asegurando que la función no pueda modificar los datos originales. Practicarás el uso de fgets() para leer cadenas que contienen espacios, strcspn() para eliminar saltos de línea finales, el operador de flecha para acceder a los miembros del struct a través de un puntero, strchr() para la búsqueda de caracteres y la lógica condicional para la categorización de datos. El uso de const en la declaración del parámetro es una buena práctica que evita la modificación accidental de los datos del contacto dentro de la función de visualización.

Pruébalo tú mismo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char name[50];
    char phone[20];
    char email[40];
    int age;
} Contact;

Contact* createContact() {
    Contact* contact = (Contact*)malloc(sizeof(Contact));
    if (contact == NULL) {
        return NULL;
    }
    
    strcpy(contact->name, "");
    strcpy(contact->phone, "");
    strcpy(contact->email, "");
    contact->age = 0;
    
    return contact;
}

void populateContact(Contact* contactPtr) {
    printf("Enter name: ");
    scanf("%s", contactPtr->name);
    
    printf("Enter phone: ");
    scanf("%s", contactPtr->phone);
    
    printf("Enter email: ");
    scanf("%s", contactPtr->email);
    
    printf("Enter age: ");
    scanf("%d", &contactPtr->age);
    
    if (contactPtr->age < 0 || contactPtr->age > 120) {
        printf("Invalid age entered\n");
    } else if (strlen(contactPtr->phone) < 10) {
        printf("Invalid phone number\n");
    } else {
        printf("Contact populated successfully\n");
    }
}

int main() {
    Contact* contact = createContact();
    
    if (contact == NULL) {
        return 1;
    }
    
    populateContact(contact);
    
    printf("Contact Information:\n");
    printf("Name: %s\n", contact->name);
    printf("Phone: %s\n", contact->phone);
    printf("Email: %s\n", contact->email);
    printf("Age: %d\n", contact->age);
    
    free(contact);
    printf("Contact deleted successfully\n");
    
    return 0;
}

Todas las lecciones de Logic & Flow