Funkcja wyświetlająca kontakt
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 53 z 63.
Wyzwanie
ŁatwyRozbudowując system zarządzania kontaktami z poprzednich lekcji, utwórz funkcję, która wyświetla informacje o kontakcie w sformatowany sposób. Ta lekcja wprowadza trzy nowe funkcje do obsługi ciągów znaków: fgets(), strcspn() i strchr(); każda z nich została wyjaśniona poniżej, przed wymaganiami.
Nowe funkcje używane w tej lekcji:
fgets(buffer, size, stdin): odczytuje wiersz danych wejściowych, łącznie ze spacjami (w przeciwieństwie doscanf, które kończy odczyt na białym znaku). Zapisuje dane wejściowe dobuffer, odczytując maksymalniesize - 1znaków. Na końcu zapisuje również znak nowej linii'\n'.strcspn(str, "\n"): zwraca indeks pierwszego wystąpienia'\n'wstr. Służy do usunięcia końcowego znaku nowej linii pozostawionego przezfgets:str[strcspn(str, "\n")] = '\0';strchr(str, ch): wyszukuje znakchwstri zwraca wskaźnik do jego położenia lubNULL, jeśli nie zostanie znaleziony.
Twój program powinien:
- Używać tej samej definicji struktury
Contactco w poprzednich lekcjach, z polami:- Tablicę znaków
nameo rozmiarze 50 - Tablicę znaków
phoneo rozmiarze 20 - Tablicę znaków
emailo rozmiarze 40 - Liczbę całkowitą
age
- Tablicę znaków
- Używać tej samej funkcji
createContactco w poprzednich lekcjach, która:- Dynamicznie przydziela pamięć dla struktury
Contact - Inicjalizuje wszystkie pola wartościami domyślnymi
- Zwraca wskaźnik do kontaktu
- Dynamicznie przydziela pamięć dla struktury
- Napisać funkcję
populateContact, która:- Przyjmuje jako parametr wskaźnik do struktury
Contact - Używa
fgets()do odczytu każdego pola tekstowego (name, phone, email), aby można było podawać imiona i nazwiska zawierające spacje - Używa
strcspn()do usunięcia końcowego znaku nowej linii z każdego pola tekstowego po jego odczytaniu - Używa
scanf("%d", ...)do odczytu pola wieku będącego liczbą całkowitą - Uwaga: Ta wersja funkcji
populateContactnie sprawdza długości numeru telefonu: nie dodawaj takiego sprawdzania, ponieważ dane testowe zawierają krótkie numery telefonu, takie jak555-1234
- Przyjmuje jako parametr wskaźnik do struktury
- Napisać funkcję o nazwie
displayContact, która:- Przyjmuje jako parametr wskaźnik do stałej struktury
Contact:const struct Contact *contactPtr - Nic nie zwraca (void)
- Wyświetla informacje o kontakcie w dokładnie takim formacie:
=== CONTACT DETAILS ===Name: [name]Phone: [phone]Email: [email]Age: [age] years old========================
- Po wyświetleniu podstawowych informacji oblicza i wyświetla dodatkowe szczegóły:
- Oblicza długość imienia i nazwiska za pomocą
strlen()i wyświetla:Name length: [length] characters - Określa kategorię pokoleniową na podstawie wieku i wyświetla:
- Jeśli wiek mieści się w przedziale od 0 do 12:
Generation: Child - Jeśli wiek mieści się w przedziale od 13 do 19:
Generation: Teenager - Jeśli wiek mieści się w przedziale od 20 do 39:
Generation: Young Adult - Jeśli wiek mieści się w przedziale od 40 do 59:
Generation: Middle-aged Adult - Jeśli wiek wynosi 60 lub więcej:
Generation: Senior
- Jeśli wiek mieści się w przedziale od 0 do 12:
- Sprawdza za pomocą
strchr(), czy adres e-mail zawiera znak'@', i wyświetla:- Jeśli znaleziono
'@':Email format: Valid - Jeśli nie znaleziono
'@':Email format: Invalid
- Jeśli znaleziono
- Oblicza długość imienia i nazwiska za pomocą
- Przyjmuje jako parametr wskaźnik do stałej struktury
- W funkcji main:
- Utworzyć kontakt za pomocą funkcji
createContact - Sprawdzić, czy utworzenie kontaktu się powiodło
- Wywołać funkcję
populateContact, aby uzupełnić dane kontaktu - Wywołać funkcję
displayContact, aby wyświetlić sformatowane informacje o kontakcie - Zwolić dynamicznie przydzieloną pamięć
- Wyświetlić
Program completed successfully
- Utworzyć kontakt za pomocą funkcji
To wyzwanie pokazuje, jak utworzyć funkcję wyświetlającą, która przyjmuje wskaźnik do stałej struktury, dzięki czemu funkcja nie może modyfikować oryginalnych danych. Poćwiczysz używanie fgets() do odczytywania ciągów znaków zawierających spacje, strcspn() do usuwania końcowych znaków nowej linii, operatora strzałki do uzyskiwania dostępu do pól struktury przez wskaźnik, strchr() do wyszukiwania znaków oraz logiki warunkowej do kategoryzowania danych. Użycie const w deklaracji parametru to dobra praktyka, która zapobiega przypadkowej modyfikacji danych kontaktu wewnątrz funkcji wyświetlającej.
Spróbuj swoich sił
#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;
}Wszystkie lekcje w sekcji Logika i sterowanie przepływem
1Podstawy wskaźników
Czym jest wskaźnik?Deklarowanie wskaźnikówOperator pobrania adresu (&)Operator dereferencji (*)Wskaźniki NULLPodsumowanie: podstawy wskaźników4Projekt: Proste narzędzie tekstowe
Przegląd projektuLiczenie znaków2Wskaźniki i tablice
Nazwy tablic jako wskaźnikiElementy tablic — wskaźnikiArytmetyka wskaźnikówPorównywanie wskaźnikówPodsumowanie: przechodzenie po tablicy za pomocą wskaźników5Wskaźniki i funkcje
Przekazywanie przez wartośćPrzekazywanie wskaźników do funkcjiModyfikowanie zmiennych za pomocą wskaźnikówKlasyczny przykład: zamianaPrzekazywanie tablic do funkcjiPowtórka: argumenty wskaźnikowe funkcji8Struktury i wskaźniki
Wskaźniki do strukturOperator strzałki (->)Przekazywanie struktur przez wartośćPrzekazywanie wskaźników do strukturDynamiczna alokacja strukturPodsumowanie: modyfikowanie struktury — wskaźnik11Końcowe zadania powtórkowe
Powtórka: dynamiczne łączenie ciągów znakówPowtórka: tablica strukturPowtórka: licznik częstotliwości słów3Tablice znaków i ciągi znaków
Ciągi znaków jako tablice charZnak końca ciąguWczytywanie ciągu za pomocą scanfUżywanie strlen()Używanie strcpy()Używanie strcat()Używanie strcmp()Podsumowanie: podstawowe funkcje do obsługi ciągów znaków6Zarządzanie pamięcią
Pamięć stosu a stertyAlokacja dynamiczna — malloc()Użycie sizeof() do alokacjiSprawdzanie niepowodzenia alokacjiZwalnianie pamięci za pomocą free()Alokacja za pomocą calloc()Podsumowanie: tablica dynamiczna9Projekt: Prosty wpis kontaktu
Projekt: Definiowanie struktury kontaktuFunkcja tworząca kontaktPoćwicz samodzielnie: Kompilator C online