Kişi Oluşturma Fonksiyonu
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 51 / 63.
Görev
KolayÖnceki dersteki Contact yapınızın (struct) üzerine inşa ederek, yeni bir kişi için dinamik olarak bellek ayıran bir fonksiyon oluşturun. Programınız şunları yapmalıdır:
- Önceki dersteki şu üyelere sahip aynı
Contactyapısı tanımını kullanın:- 50 boyutunda bir karakter dizisi
name - 20 boyutunda bir karakter dizisi
phone - 40 boyutunda bir karakter dizisi
email - Bir tam sayı
age
- 50 boyutunda bir karakter dizisi
- Aşağıdaki özelliklere sahip
createContactadında bir fonksiyon yazın:- Parametre almaz
- Bir
Contactyapısına işaret eden bir pointer döndürür - Bir
Contactyapısı için dinamik olarak bellek ayırmak üzeremalloc()kullanır - Bellek ayırma işleminin başarılı olup olmadığını kontrol eder:
- Tahsis başarısız olursa (NULL dönerse),
Memory allocation failedyazdırır ve NULL döndürür - Tahsis başarılı olursa,
Contact created successfullyyazdırır
- Tahsis başarısız olursa (NULL dönerse),
- Ok operatörünü (arrow operator) kullanarak tüm yapı üyelerini varsayılan değerlere başlatır:
contactPtr->name[0] = '\0';kullanaraknameüyesini boş bir dizeye ayarlarcontactPtr->phone[0] = '\0';kullanarakphoneüyesini boş bir dizeye ayarlarcontactPtr->email[0] = '\0';kullanarakemailüyesini boş bir dizeye ayarlarcontactPtr->age = 0;kullanarakageüyesini 0'a ayarlar
- Yeni oluşturulan kişinin pointer'ını döndürür
- Main fonksiyonu içinde:
newContactadında birContactyapısı pointer'ı tanımlayıncreateContactfonksiyonunu çağırın ve dönen pointer'ınewContactdeğişkenine atayın- Kişi oluşturma işleminin başarılı olup olmadığını kontrol edin:
- Eğer
newContactNULL ise,Failed to create contactyazdırın ve programdan çıkın - Başarılıysa,
Contact initialized with default valuesyazdırın
- Eğer
- Başlatılan kişi bilgilerini ok operatörünü kullanarak tam olarak şu formatta görüntüleyin:
Default Contact Values:Name: [name](boş olacak)Phone: [phone](boş olacak)Email: [email](boş olacak)Age: [age](0 olacak)
free(newContact)kullanarak dinamik olarak ayrılan belleği serbest bırakınMemory freed successfullyyazdırın
Bu meydan okuma, fabrika fonksiyonları (factory functions) kavramını tanıtır - dinamik olarak ayrılmış yapılara pointer oluşturan ve döndüren fonksiyonlar. Dinamik bellek ayırma, uygun hata kontrolü, pointer'lar aracılığıyla yapı başlatma ve bellek temizleme konularında pratik yapacaksınız.
Kendin dene
#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;
}Logic & Flow bölümündeki tüm dersler
1Pointer Temelleri
Pointer Nedir?Pointer TanımlamaAdres Operatörü (&)Dereference Operatörü (*)NULL Pointer'larÖzet: Pointer Temelleri4Proje: Basit Metin Aracı
Projeye Genel BakışKarakter Sayma2İşaretçiler ve Diziler
İşaretçi Olarak Dizi İsimleriDizi Elemanları - İşaretçilerİşaretçi Aritmetiğiİşaretçilerin KarşılaştırılmasıÖzet: İşaretçi ile Dizi Gezinme5İşaretçiler ve Fonksiyonlar
Değer ile GeçmeFonksiyonlara İşaretçi Göndermeİşaretçiler ile Değişkenleri DeğiştirmeKlasik Bir Örnek: SwapFonksiyonlara Dizi GöndermeÖzet: Fonksiyon İşaretçi Argümanları8Yapılar ve İşaretçiler
Yapılara İşaretçilerOk Operatörü (->)Yapıları Değer ile AktarmaYapı İşaretçilerini AktarmaYapıların Dinamik TahsisiÖzet: Yapıyı Değiştirme - Ptr11Son Tekrar Görevleri
Tekrar: Dinamik String BirleştirmeTekrar: Struct DizisiTekrar: Kelime Frekans Sayacı3Karakter Dizileri ve Stringler
char Dizisi Olarak StringlerNull Sonlandırıcıscanf ile String Girişistrlen() Kullanımıstrcpy() Kullanımıstrcat() Kullanımıstrcmp() KullanımıÖzet: Temel String Fonksiyonları6Bellek Yönetimi
Stack ve Heap BellekDinamik Bellek Ayırma - malloc()Bellek Ayırma için sizeof() KullanımıBellek Ayırma Hatasını Kontrol Etmefree() ile Belleği Serbest Bırakmacalloc() ile Bellek AyırmaÖzet: Dinamik Dizi9Proje: Basit Kişi Kaydı
Proje: Kişi Struct'ını TanımlamaKişi Oluşturma Fonksiyonu