Funkcja wyświetlająca kontakt
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 53 z 63.
Wyzwanie
ŁatwyRozwijając system zarządzania kontaktami z poprzednich lekcji, utwórz funkcję, która wyświetla informacje o kontakcie w sformatowany sposób. W tej lekcji poznasz trzy nowe funkcje łańcuchów znaków, których będziesz potrzebować: fgets(), strcspn() i strchr(); każda z nich jest wyjaśniona poniżej, przed wymaganiami.
Nowe funkcje używane w tej lekcji:
fgets(buffer, size, stdin): odczytuje wiersz danych wejściowych wraz ze spacjami (w przeciwieństwie doscanf, które kończy odczyt na białym znaku). Zapisuje dane wejściowe wbuffer, odczytując maksymalniesize - 1znaków. Zapisuje również na końcu 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 alboNULL, jeśli nie zostanie znaleziony.
Twój program powinien:
- Użyć tej samej definicji struktury
Contactco w poprzednich lekcjach, z polami:- Tablica znaków
nameo rozmiarze 50 - Tablica znaków
phoneo rozmiarze 20 - Tablica znaków
emailo rozmiarze 40 - Liczba całkowita
age
- Tablica znaków
- Użyć 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 (imienia i nazwiska, telefonu, adresu e-mail), aby można było wprowadzać 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ą - Przed odczytaniem każdego pola wyświetla dokładnie następujący tekst zachęty, bez znaku nowej linii na końcu:
Enter name:,Enter phone:,Enter email:,Enter age:(tak aby=== CONTACT DETAILS ===pojawiło się w tym samym wierszu poEnter age:) - Uwaga: Ta wersja funkcji
populateContactnie zawiera sprawdzania długości numeru telefonu: nie dodawaj go, 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 lat:
Generation: Child - Jeśli wiek mieści się w przedziale od 13 do 19 lat:
Generation: Teenager - Jeśli wiek mieści się w przedziale od 20 do 39 lat:
Generation: Young Adult - Jeśli wiek mieści się w przedziale od 40 do 59 lat:
Generation: Middle-aged Adult - Jeśli wiek wynosi 60 lat lub więcej:
Generation: Senior
- Jeśli wiek mieści się w przedziale od 0 do 12 lat:
- Sprawdza za pomocą
strchr(), czy adres e-mail zawiera znak'@', i wyświetla:- Jeśli znak
'@'zostanie znaleziony:Email format: Valid - Jeśli znak
'@'nie zostanie znaleziony:Email format: Invalid
- Jeśli znak
- 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 tworzenie kontaktu zakończyło się powodzeniem
- Wywołać funkcję
populateContact, aby uzupełnić dane kontaktu - Wywołać funkcję
displayContact, aby wyświetlić sformatowane informacje o kontakcie - Zwolnić 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 łańcuchó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 za pomocą wskaźnika, 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