Menu
CoddyTech

Función para mostrar un contacto

Parte de la sección Lógica y Flujo del Journey de C de Coddy. Lección 53 de 63.

challenge icon

Desafío

Fácil

Partiendo del sistema de gestión de contactos de las lecciones anteriores, crea una función que muestre la información de un contacto con un formato específico. En esta lección se presentan tres nuevas funciones de cadenas 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, incluidos los espacios (a diferencia de scanf, que se detiene ante un espacio 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 carácter de nueva línea final que deja 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 lo encuentra.

Tu programa debe:

  1. Usar la misma definición de la estructura Contact de las lecciones anteriores, con los miembros:
    • Un arreglo de caracteres name de tamaño 50
    • Un arreglo de caracteres phone de tamaño 20
    • Un arreglo de caracteres email de tamaño 40
    • Un entero age
  2. Usar la misma función createContact de las lecciones anteriores, que:
    • Asigna memoria dinámicamente para una estructura Contact
    • Inicializa todos los miembros con valores predeterminados
    • Devuelve un puntero al contacto
  3. Escribir una función populateContact que:
    • Tome como parámetro un puntero a una estructura Contact
    • Use fgets() para leer cada campo de cadena (name, phone, email) y así aceptar nombres con espacios
    • Use strcspn() para eliminar el carácter de nueva línea final de cada campo de cadena después de leerlo
    • Use scanf("%d", ...) para leer el campo entero de la edad
    • Antes de leer cada campo, imprima exactamente su indicación, sin añadir un carácter de nueva línea: Enter name: , Enter phone: , Enter email: , Enter age: (así, === CONTACT DETAILS === aparece en la misma línea después de Enter age: )
    • Nota: Esta versión de populateContact no incluye la validación de la longitud del número de teléfono: no la añadas, ya que las entradas de prueba usan números de teléfono cortos como 555-1234
  4. Escribir una función llamada displayContact que:
    • Tome como parámetro un puntero constante a una estructura Contact: const struct Contact *contactPtr
    • No devuelva nada (void)
    • Imprima la información del contacto con 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 generacional según 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 más: Generation: Senior
      • Compruebe si el correo electrónico contiene el carácter '@' usando strchr() e imprima:
        • Si encuentra '@': Email format: Valid
        • Si no encuentra '@': Email format: Invalid
  5. En la función principal:
    • Cree un contacto usando la función createContact
    • Compruebe si la creación del contacto se realizó correctamente
    • Llame a la función populateContact para completar los datos del contacto
    • Llame a la función displayContact para mostrar la información del contacto con el formato especificado
    • Libere la memoria asignada dinámicamente
    • Imprima Program completed successfully

Este desafío demuestra cómo crear una función de visualización que recibe un puntero constante a una estructura, lo que garantiza que la función no pueda modificar los datos originales. Practicarás el uso de fgets() para leer cadenas que contienen espacios, de strcspn() para eliminar los caracteres de nueva línea finales, del operador flecha para acceder a los miembros de una estructura mediante un puntero, de strchr() para buscar caracteres y de la lógica condicional para categorizar datos. Usar 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 Lógica y Flujo

Practica por tu cuenta: Compilador de C online