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.
Desafío
FácilBasándote en tu sistema de gestión de contactos de las lecciones anteriores, crea una función que muestre la información de contacto de forma estructurada. En esta lección se presentan tres funciones nuevas para 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 descanf, que se detiene ante los espacios en blanco). Almacena la entrada enbuffer, leyendo como máximosize - 1caracteres. 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'enstr. Se utiliza para eliminar la nueva línea final que dejafgets:str[strcspn(str, "\n")] = '\0';strchr(str, ch): busca el carácterchenstry devuelve un puntero a su ubicación, oNULLsi no se encuentra.
Tu programa debe:
- Usar la misma definición de la estructura
Contactde las lecciones anteriores, con los miembros:- Un arreglo de caracteres
namecon tamaño 50 - Un arreglo de caracteres
phonecon tamaño 20 - Un arreglo de caracteres
emailcon tamaño 40 - Un entero
age
- Un arreglo de caracteres
- Usar la misma función
createContactde las lecciones anteriores, que:- Asigna memoria dinámicamente para una estructura
Contact - Inicializa todos los miembros con valores predeterminados
- Devuelve un puntero al contacto
- Asigna memoria dinámicamente para una estructura
- Escribir una función
populateContactque:- Reciba como parámetro un puntero a una estructura
Contact - Use
fgets()para leer cada campo de cadena (nombre, teléfono y correo electrónico), de modo que se acepten nombres con espacios - Use
strcspn()para eliminar la nueva 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
populateContactno incluye la validación de la longitud del número de teléfono: no la agregues, ya que las entradas de prueba usan números de teléfono cortos como555-1234
- Reciba como parámetro un puntero a una estructura
- Escribir una función llamada
displayContactque:- Reciba como parámetro un puntero constante a una estructura
Contact:const struct Contact *contactPtr - No devuelva nada (void)
- Imprima la información de 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, calcular y mostrar detalles adicionales:
- Calcular la longitud del nombre usando
strlen()e imprimir:Name length: [length] characters - Determinar la categoría generacional según la edad e imprimir:
- 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 de 60 o más:
Generation: Senior
- Si la edad está entre 0 y 12:
- Comprobar si el correo electrónico contiene el carácter
'@'usandostrchr()e imprimir:- Si se encuentra
'@':Email format: Valid - Si no se encuentra
'@':Email format: Invalid
- Si se encuentra
- Calcular la longitud del nombre usando
- Reciba como parámetro un puntero constante a una estructura
- En la función principal:
- Crear un contacto usando la función
createContact - Comprobar si la creación del contacto se realizó correctamente
- Llamar a la función
populateContactpara completar los datos del contacto - Llamar a la función
displayContactpara mostrar la información de contacto estructurada - Liberar la memoria asignada dinámicamente
- Imprimir
Program completed successfully
- Crear un contacto usando la función
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, strcspn() para eliminar nuevas líneas finales, el operador flecha para acceder a los miembros de una estructura mediante un puntero, strchr() para buscar caracteres y la lógica condicional para categorizar 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 Lógica y Flujo
1Fundamentos de Punteros
¿Qué es un puntero?Declaración de punterosEl operador de dirección (&)El operador de desreferencia (*)Punteros NULLResumen: Conceptos básicos de punteros4Proyecto: Utilidad de texto simple
Descripción general del proyectoContar caracteres2Punteros y Arrays
Nombres de Arrays como PunterosElementos de un Array - PunterosAritmética de PunterosComparación de PunterosResumen: Recorrido de Arrays con Punteros5Punteros y funciones
Paso por valorPasar punteros a funcionesModificar variables mediante punterosUn ejemplo clásico: Intercambio (Swap)Pasar arrays a funcionesResumen: Argumentos de punteros a funciones3Arreglos de caracteres y cadenas
Cadenas como arreglos de charEl terminador nuloEntrada de cadenas con scanfUso de strlen()Uso de strcpy()Uso de strcat()Uso de strcmp()Resumen: Funciones básicas de cadenas6Gestión de memoria
Memoria Stack vs. HeapAsignación dinámica - malloc()Uso de sizeof() para la asignaciónComprobación de fallos de asignaciónLiberación de memoria con free()Asignación con calloc()Resumen: Arrays dinámicos9Proyecto: Registro de contacto simple
Proyecto: Definir la estructura ContactFunción para crear un contactoPractica por tu cuenta: Compilador de C online