Menu
CoddyTech

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

Rozwijają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 do scanf, które kończy odczyt na białym znaku). Zapisuje dane wejściowe w buffer, odczytując maksymalnie size - 1 znaków. Zapisuje również na końcu 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 albo NULL, jeśli nie zostanie znaleziony.

Twój program powinien:

  1. Użyć tej samej definicji struktury Contact co w poprzednich lekcjach, z polami:
    • Tablica znaków name o rozmiarze 50
    • Tablica znaków phone o rozmiarze 20
    • Tablica znaków email o rozmiarze 40
    • Liczba całkowita age
  2. Użyć 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 (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 po Enter age: )
    • Uwaga: Ta wersja funkcji populateContact nie zawiera sprawdzania długości numeru telefonu: nie dodawaj go, 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 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
      • 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
  5. 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

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

Poćwicz samodzielnie: Kompilator C online