Menu
Coddy logo textTech

Funkcja wyświetlająca kontakt

Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 53 z 63.

challenge icon

Wyzwanie

Łatwy

Rozbudowują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 do scanf, które kończy odczyt na białym znaku). Zapisuje dane wejściowe do buffer, odczytując maksymalnie size - 1 znaków. Na końcu zapisuje również znak nowej linii '\n'.
  • strcspn(str, "\n"): zwraca indeks pierwszego wystąpienia '\n' w str. Służy do usunięcia końcowego znaku nowej linii pozostawionego przez fgets: str[strcspn(str, "\n")] = '\0';
  • strchr(str, ch): wyszukuje znak ch w str i zwraca wskaźnik do jego położenia lub NULL, jeśli nie zostanie znaleziony.

Twój program powinien:

  1. Używać tej samej definicji struktury Contact co w poprzednich lekcjach, z polami:
    • Tablicę znaków name o rozmiarze 50
    • Tablicę znaków phone o rozmiarze 20
    • Tablicę znaków email o rozmiarze 40
    • Liczbę całkowitą age
  2. Używać tej samej funkcji createContact co w poprzednich lekcjach, która:
    • Dynamicznie przydziela pamięć dla struktury Contact
    • Inicjalizuje wszystkie pola wartościami domyślnymi
    • Zwraca wskaźnik do kontaktu
  3. 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 populateContact nie sprawdza długości numeru telefonu: nie dodawaj takiego sprawdzania, ponieważ dane testowe zawierają krótkie numery telefonu, takie jak 555-1234
  4. 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
      • 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
  5. 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

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

Poćwicz samodzielnie: Kompilator C online