Funkcja tworząca kontakt
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 51 z 63.
Wyzwanie
ŁatwyOpierając się na strukturze Contact z poprzedniej lekcji, utwórz funkcję, która dynamicznie przydziela pamięć dla nowego kontaktu. Twój program powinien:
- Użyć tej samej definicji struktury
Contactz poprzedniej lekcji, zawierającej pola:- 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
- Napisać funkcję o nazwie
createContact, która:- Nie przyjmuje żadnych parametrów
- Zwraca wskaźnik do struktury
Contact - Używa
malloc()do dynamicznego przydzielenia pamięci dla jednej strukturyContact - Sprawdza, czy przydzielenie pamięci się powiodło:
- Jeśli przydzielenie się nie powiedzie (zwraca NULL), wyświetla
Memory allocation failedi zwraca NULL - Jeśli przydzielenie się powiedzie, wyświetla
Contact created successfully
- Jeśli przydzielenie się nie powiedzie (zwraca NULL), wyświetla
- Inicjalizuje wszystkie pola struktury wartościami domyślnymi, używając operatora strzałki:
- Ustawia
namena pusty ciąg znaków za pomocącontactPtr->name[0] = '\0'; - Ustawia
phonena pusty ciąg znaków za pomocącontactPtr->phone[0] = '\0'; - Ustawia
emailna pusty ciąg znaków za pomocącontactPtr->email[0] = '\0'; - Ustawia
agena 0 za pomocącontactPtr->age = 0;
- Ustawia
- Zwraca wskaźnik do nowo utworzonego kontaktu
- W funkcji main:
- Deklaruje wskaźnik do struktury
Contacto nazwienewContact - Wywołuje funkcję
createContacti przypisuje zwrócony wskaźnik donewContact - Sprawdza, czy utworzenie kontaktu się powiodło:
- Jeśli
newContactma wartość NULL, wyświetlaFailed to create contacti kończy działanie programu - Jeśli się powiedzie, wyświetla
Contact initialized with default values
- Jeśli
- Wyświetla zainicjalizowane informacje o kontakcie, używając operatora strzałki, w dokładnie tym formacie:
Default Contact Values:Name: [name](będzie puste)Phone: [phone](będzie puste)Email: [email](będzie puste)Age: [age](będzie równe 0)
- Zwalnia dynamicznie przydzieloną pamięć za pomocą
free(newContact) - Wyświetla
Memory freed successfully
- Deklaruje wskaźnik do struktury
To wyzwanie wprowadza pojęcie funkcji fabrykujących — funkcji, które tworzą i zwracają wskaźniki do dynamicznie przydzielonych struktur. Przećwiczysz dynamiczne przydzielanie pamięci, prawidłowe sprawdzanie błędów, inicjalizowanie struktur za pośrednictwem wskaźników oraz zwalnianie pamięci.
Spróbuj swoich sił
#include <stdio.h>
#include <string.h>
// TODO: Define the Contact struct here
struct Contact {
char name[50];
char phone[20];
char email[40];
int age;
};
int main() {
// TODO: Create a Contact variable named person
struct Contact person;
// Read input values
scanf("%s", person.name);
scanf("%s", person.phone);
scanf("%s", person.email);
scanf("%d", &person.age);
// TODO: Write your validation and output code below
if (person.age < 0 || person.age > 120) {
printf("Invalid age");
return 0;
}
if (strlen(person.phone) < 10) {
printf("Invalid phone number");
return 0;
}
printf("Contact Information:\n");
printf("Name: %s\n", person.name);
printf("Phone: %s\n", person.phone);
printf("Email: %s\n", person.email);
printf("Age: %d\n", person.age);
printf("Name length: %lu\n", strlen(person.name));
if (person.age >= 0 && person.age <= 17) {
printf("Category: Minor");
} else if (person.age >= 18 && person.age <= 64) {
printf("Category: Adult");
} else {
printf("Category: Senior");
}
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