Funzione per visualizzare un contatto
Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 53 di 63.
Sfida
FacileBasandoti 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 discanf, che si interrompe in corrispondenza degli spazi bianchi). Memorizza l'input inbuffer, leggendo al massimosize - 1caratteri. Memorizza anche il carattere di nuova riga'\n'alla fine.strcspn(str, "\n"): restituisce l'indice della prima occorrenza di'\n'instr. Si usa per rimuovere il carattere di nuova riga finale lasciato dafgets:str[strcspn(str, "\n")] = '\0';strchr(str, ch): cerca il caratterechinstre restituisce un puntatore alla sua posizione, oppureNULLse non viene trovato.
Il tuo programma dovrebbe:
- Usare la stessa definizione della struct
Contactdelle lezioni precedenti, con i membri:- Un array di caratteri
namedi dimensione 50 - Un array di caratteri
phonedi dimensione 20 - Un array di caratteri
emaildi dimensione 40 - Un intero
age
- Un array di caratteri
- Usare la stessa funzione
createContactdelle lezioni precedenti, che:- Alloca dinamicamente memoria per una struct
Contact - Inizializza tutti i membri con valori predefiniti
- Restituisce un puntatore al contatto
- Alloca dinamicamente memoria per una struct
- Scrivere una funzione
populateContactche:- 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
populateContactnon include la convalida della lunghezza del numero di telefono: non aggiungerla, perché gli input dei test usano numeri di telefono brevi come555-1234
- Accetta come parametro un puntatore a una struct
- Scrivere una funzione chiamata
displayContactche:- 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
- Se l'età è compresa tra 0 e 12:
- Verifica se l'email contiene il carattere
'@'usandostrchr()e stampa:- Se
'@'viene trovato:Email format: Valid - Se
'@'non viene trovato:Email format: Invalid
- Se
- Calcola la lunghezza del nome usando
- Accetta come parametro un puntatore costante a una struct
- Nella funzione main:
- Crea un contatto usando la funzione
createContact - Verifica che la creazione del contatto sia riuscita
- Chiama la funzione
populateContactper inserire i dati del contatto - Chiama la funzione
displayContactper mostrare le informazioni del contatto formattate - Libera la memoria allocata dinamicamente
- Stampa
Program completed successfully
- Crea un contatto usando la funzione
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
1Fondamenti dei puntatori
Che cos’è un puntatore?Dichiarare i puntatoriL’operatore di indirizzo (&)L’operatore di dereferenziazione (*)Puntatori NULLRiepilogo: nozioni di base sui puntatori4Progetto: Utility di testo semplice
Panoramica del progettoConteggio dei caratteri2Puntatori e array
I nomi degli array come puntatoriElementi degli array e puntatoriAritmetica dei puntatoriConfrontare i puntatoriRiepilogo: attraversamento di un array con i puntatori5Puntatori e funzioni
Passaggio per valorePassare puntatori alle funzioniModificare le variabili tramite puntatoriUn esempio classico: scambiare valoriPassare array alle funzioniRiepilogo: argomenti puntatore nelle funzioni3Array di caratteri e stringhe
Stringhe come array di charIl terminatore nullInput di stringhe con scanfUso di strlen()Uso di strcpy()Uso di strcat()Uso di strcmp()Riepilogo: funzioni di base per le stringhe6Gestione della memoria
Memoria Stack vs. HeapAllocazione dinamica - malloc()Usare sizeof() per l'allocazioneVerificare il fallimento dell'allocazioneLiberare la memoria con free()Allocare con calloc()Riepilogo: array dinamico9Progetto: Inserimento semplice di un contatto
Progetto: Definire una struct ContattoFunzione per creare un contattoEsercitati da solo: Compilatore C online