Kişi Görüntüleme Fonksiyonu
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 53 / 63.
Görev
KolayÖnceki derslerdeki kişi yönetim sisteminizi temel alarak, kişi bilgilerini formatlı bir şekilde görüntüleyen bir fonksiyon oluşturun. Bu ders, ihtiyacınız olacak üç yeni dize fonksiyonunu tanıtmaktadır: fgets(), strcspn() ve strchr() — her biri gereksinimlerden önce aşağıda açıklanmıştır.
Bu derste kullanılan yeni fonksiyonlar:
fgets(buffer, size, stdin)— boşluklar dahil olmak üzere bir girdi satırını okur (boşlukta duranscanf'in aksine). Girdiyibufferiçine depolar ve en fazlasize - 1karakter okur. Ayrıca sonuna yeni satır karakterini'\n'ekler.strcspn(str, "\n")—striçindeki ilk'\n'karakterinin indeksini döndürür.fgetstarafından bırakılan sondaki yeni satırı kaldırmak için kullanılır:str[strcspn(str, "\n")] = '\0';strchr(str, ch)—striçindechkarakterini arar ve konumuna bir işaretçi döndürür veya bulunamazsaNULLdöndürür.
Programınız şunları yapmalıdır:
- Önceki derslerdeki şu üyelere sahip aynı
Contactstruct 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
- Önceki derslerdeki şu işleri yapan aynı
createContactfonksiyonunu kullanın:- Bir
Contactstruct'ı için dinamik olarak bellek ayırır - Tüm üyeleri varsayılan değerlere başlatır
- Kişiye bir işaretçi döndürür
- Bir
- Şu işleri yapan bir
populateContactfonksiyonu yazın:- Parametre olarak bir
Contactstruct işaretçisi alır - Her dize alanını (name, phone, email) okumak için
fgets()kullanır, böylece boşluk içeren isimler kabul edilir - Okuduktan sonra her dize alanından sondaki yeni satırı kaldırmak için
strcspn()kullanır - Tam sayı yaş alanını okumak için
scanf("%d", ...)kullanır - Not:
populateContactfonksiyonunun bu sürümü telefon numarası uzunluk doğrulaması içermez — test girdileri555-1234gibi kısa telefon numaraları kullandığından bunu eklemeyin
- Parametre olarak bir
displayContactadında bir fonksiyon yazın:- Parametre olarak bir
Contactstruct'ına sabit bir işaretçi alır:const struct Contact *contactPtr - Hiçbir şey döndürmez (void)
- Kişi bilgilerini tam olarak şu formatta yazdırır:
=== CONTACT DETAILS ===Name: [name]Phone: [phone]Email: [email]Age: [age] years old========================
- Temel bilgileri görüntüledikten sonra ek ayrıntıları hesaplar ve görüntüler:
strlen()kullanarak ismin uzunluğunu hesaplar ve şunu yazdırır:Name length: [length] characters- Yaşa göre nesil kategorisini belirler ve şunu yazdırır:
- Eğer yaş 0 ile 12 arasındaysa:
Generation: Child - Eğer yaş 13 ile 19 arasındaysa:
Generation: Teenager - Eğer yaş 20 ile 39 arasındaysa:
Generation: Young Adult - Eğer yaş 40 ile 59 arasındaysa:
Generation: Middle-aged Adult - Eğer yaş 60 veya üzerindeyse:
Generation: Senior
- Eğer yaş 0 ile 12 arasındaysa:
strchr()kullanarak e-postanın'@'karakterini içerip içermediğini kontrol eder ve şunu yazdırır:- Eğer
'@'bulunursa:Email format: Valid - Eğer
'@'bulunamazsa:Email format: Invalid
- Eğer
- Parametre olarak bir
- Ana fonksiyonda (main):
createContactfonksiyonunu kullanarak bir kişi oluşturun- Kişi oluşturmanın başarılı olup olmadığını kontrol edin
- Kişi verilerini doldurmak için
populateContactfonksiyonunu çağırın - Formatlı kişi bilgilerini göstermek için
displayContactfonksiyonunu çağırın - Dinamik olarak ayrılan belleği serbest bırakın
Program completed successfullyyazdırın
Bu zorluk, bir struct'a sabit bir işaretçi alan ve fonksiyonun orijinal verileri değiştirememesini sağlayan bir görüntüleme fonksiyonunun nasıl oluşturulacağını gösterir. Boşluk içeren dizeleri okumak için fgets(), sondaki yeni satırları temizlemek için strcspn(), bir işaretçi aracılığıyla struct üyelerine erişmek için ok operatörünü, karakter arama için strchr() ve veri kategorizasyonu için koşullu mantık kullanma pratiği yapacaksınız. Parametre bildiriminde const kullanımı, görüntüleme fonksiyonu içinde kişi verilerinin yanlışlıkla değiştirilmesini önleyen iyi bir uygulamadır.
Kendin dene
#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;
}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