Menu
Coddy logo textTech

Funzione per visualizzare un contatto

Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 53 di 63.

challenge icon

Sfida

Facile

Basandoti sul sistema di gestione dei contatti delle lezioni precedenti, crea una funzione che visualizzi le informazioni di un contatto in un formato strutturato. In questa lezione vengono introdotte tre nuove funzioni per le stringhe che ti serviranno: fgets(), strcspn() e strchr(): ciascuna è spiegata qui sotto, prima dei requisiti.

Nuove funzioni usate in questa lezione:

  • fgets(buffer, size, stdin): legge una riga di input, inclusi gli spazi (a differenza di scanf, che si interrompe in corrispondenza degli spazi bianchi). Memorizza l'input in buffer, leggendo al massimo size - 1 caratteri. Memorizza anche il carattere di nuova riga '\n' alla fine.
  • strcspn(str, "\n"): restituisce l'indice della prima occorrenza di '\n' in str. Si usa per rimuovere il carattere di nuova riga finale lasciato da fgets: str[strcspn(str, "\n")] = '\0';
  • strchr(str, ch): cerca il carattere ch in str e restituisce un puntatore alla sua posizione, oppure NULL se non viene trovato.

Il tuo programma dovrebbe:

  1. Usare la stessa definizione della struct Contact delle lezioni precedenti, con i membri:
    • Un array di caratteri name di dimensione 50
    • Un array di caratteri phone di dimensione 20
    • Un array di caratteri email di dimensione 40
    • Un intero age
  2. Usare la stessa funzione createContact delle lezioni precedenti, che:
    • Alloca dinamicamente memoria per una struct Contact
    • Inizializza tutti i membri con valori predefiniti
    • Restituisce un puntatore al contatto
  3. Scrivere una funzione populateContact che:
    • Accetta come parametro un puntatore a una struct Contact
    • Usa fgets() per leggere ogni campo stringa (nome, telefono, email), in modo da accettare nomi con spazi
    • Usa strcspn() per rimuovere il carattere di nuova riga finale da ogni campo stringa dopo averlo letto
    • Usa scanf("%d", ...) per leggere il campo intero dell'età
    • Nota: questa versione di populateContact non include la convalida della lunghezza del numero di telefono: non aggiungerla, perché gli input dei test usano numeri di telefono brevi come 555-1234
  4. Scrivere una funzione chiamata displayContact che:
    • Accetta come parametro un puntatore costante a una struct Contact: const struct Contact *contactPtr
    • Non restituisce nulla (void)
    • Stampa le informazioni del contatto in questo formato esatto:
      • === CONTACT DETAILS ===
      • Name: [name]
      • Phone: [phone]
      • Email: [email]
      • Age: [age] years old
      • ========================
    • Dopo aver visualizzato le informazioni di base, calcola e visualizza ulteriori dettagli:
      • Calcola la lunghezza del nome usando strlen() e stampa: Name length: [length] characters
      • Determina la categoria generazionale in base all'età e stampa:
        • Se l'età è compresa tra 0 e 12: Generation: Child
        • Se l'età è compresa tra 13 e 19: Generation: Teenager
        • Se l'età è compresa tra 20 e 39: Generation: Young Adult
        • Se l'età è compresa tra 40 e 59: Generation: Middle-aged Adult
        • Se l'età è pari o superiore a 60: Generation: Senior
      • Verifica se l'email contiene il carattere '@' usando strchr() e stampa:
        • Se '@' viene trovato: Email format: Valid
        • Se '@' non viene trovato: Email format: Invalid
  5. Nella funzione main:
    • Crea un contatto usando la funzione createContact
    • Verifica che la creazione del contatto sia riuscita
    • Chiama la funzione populateContact per inserire i dati del contatto
    • Chiama la funzione displayContact per mostrare le informazioni del contatto formattate
    • Libera la memoria allocata dinamicamente
    • Stampa Program completed successfully

Questa sfida mostra come creare una funzione di visualizzazione che accetta un puntatore costante a una struct, assicurando che la funzione non possa modificare i dati originali. Ti eserciterai a usare fgets() per leggere stringhe contenenti spazi, strcspn() per rimuovere i caratteri di nuova riga finali, l'operatore freccia per accedere ai membri di una struct tramite un puntatore, strchr() per cercare caratteri e la logica condizionale per classificare i dati. L'uso di const nella dichiarazione del parametro è una buona pratica che impedisce modifiche accidentali ai dati del contatto all'interno della funzione di visualizzazione.

Provalo tu

#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;
}

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore C online