Kişi Görüntüleme Fonksiyonu
Coddy'nin C Journey'sinin Mantık & Akış 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 biçimlendirilmiş bir şekilde görüntüleyen bir işlev oluşturun. Bu derste ihtiyaç duyacağınız üç yeni dize işlevi tanıtılıyor: fgets(), strcspn() ve strchr(): gereksinimlerden önce her biri aşağıda açıklanmıştır.
Bu derste kullanılan yeni işlevler:
fgets(buffer, size, stdin): boşluklar da dahil olmak üzere bir girdi satırını okur (boşluk karakterinde duranscanf'den farklı olarak). Girdiyibufferiçine kaydeder ve en fazlasize - 1karakter okur. Ayrıca sonuna yeni satır karakteri'\n'ekler.strcspn(str, "\n"):striçinde ilk'\n'karakterinin indeksini döndürür.fgetstarafından bırakılan sondaki yeni satır karakterini kaldırmak için kullanılır:str[strcspn(str, "\n")] = '\0';strchr(str, ch):striçindechkarakterini arar ve bulunduğu konuma işaretçi döndürür; bulunamazsaNULLdöndürür.
Programınız şunları yapmalıdır:
- Önceki derslerdekiyle aynı
Contactyapı tanımını kullanın. Üyeleri:- Boyutu 50 olan
nameadlı bir karakter dizisi - Boyutu 20 olan
phoneadlı bir karakter dizisi - Boyutu 40 olan
emailadlı bir karakter dizisi - Bir tamsayı olan
age
- Boyutu 50 olan
- Önceki derslerdekiyle aynı
createContactişlevini kullanın. Bu işlev:- Bir
Contactyapısı için dinamik olarak bellek ayırır - Tüm üyeleri varsayılan değerlerle başlatır
- Kişiye işaretçi döndürür
- Bir
- Şunları yapan bir
populateContactişlevi yazın:- Parametre olarak bir
Contactyapısına işaretçi alır - Ad, telefon ve e-posta alanlarındaki dizeleri okumak için
fgets()kullanır; böylece boşluk içeren adlar kabul edilir - Her dize alanını okuduktan sonra sondaki yeni satır karakterini kaldırmak için
strcspn()kullanır - Tamsayı yaş alanını okumak için
scanf("%d", ...)kullanır - Her alanı okumadan önce, yeni satır eklemeden, ilgili istemi tam olarak yazdırır:
Enter name:,Enter phone:,Enter email:,Enter age:(böylece=== CONTACT DETAILS ===,Enter age:ifadesinin ardından aynı satırda görünür) - Not:
populateContactişlevinin bu sürümünde telefon numarası uzunluğu doğrulaması yoktur: bunu eklemeyin, çünkü test girdilerinde555-1234gibi kısa telefon numaraları kullanılır
- Parametre olarak bir
- Şunları yapan,
displayContactadlı bir işlev yazın:- Parametre olarak bir
Contactyapısına sabit işaretçi alır:const struct Contact *contactPtr - Değer döndürmez (
void) - Kişi bilgilerini tam olarak şu biçimde 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 adın uzunluğunu hesaplar ve şunu yazdırır:Name length: [length] characters- Yaşa göre kuşak kategorisini belirler ve şunu yazdırır:
- Yaş 0 ile 12 arasındaysa:
Generation: Child - Yaş 13 ile 19 arasındaysa:
Generation: Teenager - Yaş 20 ile 39 arasındaysa:
Generation: Young Adult - Yaş 40 ile 59 arasındaysa:
Generation: Middle-aged Adult - Yaş 60 veya üzerindeyse:
Generation: Senior
- Yaş 0 ile 12 arasındaysa:
strchr()kullanarak e-postanın'@'karakterini içerip içermediğini kontrol eder ve şunu yazdırır:'@'bulunursa:Email format: Valid'@'bulunmazsa:Email format: Invalid
- Parametre olarak bir
- main işlevinde:
createContactişlevini kullanarak bir kişi oluşturun- Kişi oluşturma işleminin başarılı olup olmadığını kontrol edin
- Kişi verilerini doldurmak için
populateContactişlevini çağırın - Biçimlendirilmiş kişi bilgilerini göstermek için
displayContactişlevini çağırın - Dinamik olarak ayrılan belleği serbest bırakın
Program completed successfullyyazdırın
Bu alıştırma, yapıya sabit işaretçi alan bir görüntüleme işlevinin nasıl oluşturulacağını gösterir; böylece işlevin özgün verileri değiştirmesi engellenir. Boşluk içeren dizeleri okumak için fgets(), sondaki yeni satır karakterlerini kaldırmak için strcspn(), işaretçi aracılığıyla yapı üyelerine erişmek için ok operatörü, karakter aramak için strchr() ve verileri kategorilere ayırmak için koşullu mantık kullanma pratiği yapacaksınız. Parametre bildiriminde const kullanmak, görüntüleme işlevi içindeki 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;
}Mantık & Akış 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 FonksiyonuKendi başına pratik yap: Online C derleyicisi