Fungsi untuk Menampilkan Kontak
Termasuk bagian Logika dan Alur dalam perjalanan C di Coddy. Pelajaran 53 dari 63.
Tantangan
MudahDengan melanjutkan sistem pengelolaan kontak dari pelajaran sebelumnya, buat fungsi yang menampilkan informasi kontak dengan format tertentu. Pelajaran ini memperkenalkan tiga fungsi string baru yang kamu perlukan: fgets(), strcspn(), dan strchr(). Penjelasan setiap fungsi tersedia di bawah, sebelum persyaratannya.
Fungsi baru yang digunakan dalam pelajaran ini:
fgets(buffer, size, stdin): membaca satu baris input, termasuk spasi, tidak sepertiscanfyang berhenti saat menemukan spasi. Fungsi ini menyimpan input ke dalambuffer, dengan membaca paling banyaksize - 1karakter. Fungsi ini juga menyimpan karakter baris baru'\n'di bagian akhir.strcspn(str, "\n"): mengembalikan indeks kemunculan pertama'\n'dalamstr. Fungsi ini digunakan untuk menghapus karakter baris baru di akhir yang ditinggalkan olehfgets:str[strcspn(str, "\n")] = '\0';strchr(str, ch): mencari karakterchdalamstrdan mengembalikan pointer ke lokasinya, atauNULLjika tidak ditemukan.
Programmu harus:
- Menggunakan definisi struct
Contactyang sama seperti di pelajaran sebelumnya, dengan anggota:- Array karakter
nameberukuran 50 - Array karakter
phoneberukuran 20 - Array karakter
emailberukuran 40 - Integer
age
- Array karakter
- Menggunakan fungsi
createContactyang sama seperti di pelajaran sebelumnya, yang:- Mengalokasikan memori secara dinamis untuk struct
Contact - Menginisialisasi semua anggota dengan nilai default
- Mengembalikan pointer ke kontak
- Mengalokasikan memori secara dinamis untuk struct
- Menulis fungsi
populateContactyang:- Menerima pointer ke struct
Contactsebagai parameternya - Menggunakan
fgets()untuk membaca setiap field string (nama, telepon, email) agar nama yang mengandung spasi dapat diterima - Menggunakan
strcspn()untuk menghapus karakter baris baru di akhir dari setiap field string setelah membacanya - Menggunakan
scanf("%d", ...)untuk membaca field usia berupa integer - Sebelum membaca setiap field, mencetak prompt persis seperti berikut, tanpa karakter baris baru setelahnya:
Enter name:,Enter phone:,Enter email:,Enter age:(sehingga=== CONTACT DETAILS ===muncul pada baris yang sama setelahEnter age:) - Catatan: Versi
populateContactini tidak mencakup validasi panjang nomor telepon. Jangan menambahkannya, karena input pengujian menggunakan nomor telepon pendek seperti555-1234.
- Menerima pointer ke struct
- Menulis fungsi bernama
displayContactyang:- Menerima pointer konstan ke struct
Contactsebagai parameternya:const struct Contact *contactPtr - Tidak mengembalikan apa pun (void)
- Mencetak informasi kontak dengan format persis berikut:
=== CONTACT DETAILS ===Name: [name]Phone: [phone]Email: [email]Age: [age] years old========================
- Setelah menampilkan informasi dasar, menghitung dan menampilkan detail tambahan:
- Menghitung panjang nama menggunakan
strlen()dan mencetak:Name length: [length] characters - Menentukan kategori generasi berdasarkan usia dan mencetak:
- Jika usia antara 0 dan 12:
Generation: Child - Jika usia antara 13 dan 19:
Generation: Teenager - Jika usia antara 20 dan 39:
Generation: Young Adult - Jika usia antara 40 dan 59:
Generation: Middle-aged Adult - Jika usia 60 atau lebih:
Generation: Senior
- Jika usia antara 0 dan 12:
- Memeriksa apakah email berisi karakter
'@'menggunakanstrchr()dan mencetak:- Jika
'@'ditemukan:Email format: Valid - Jika
'@'tidak ditemukan:Email format: Invalid
- Jika
- Menghitung panjang nama menggunakan
- Menerima pointer konstan ke struct
- Di fungsi main:
- Membuat kontak menggunakan fungsi
createContact - Memeriksa apakah pembuatan kontak berhasil
- Memanggil fungsi
populateContactuntuk mengisi data kontak - Memanggil fungsi
displayContactuntuk menampilkan informasi kontak dengan format yang ditentukan - Membebaskan memori yang dialokasikan secara dinamis
- Mencetak
Program completed successfully
- Membuat kontak menggunakan fungsi
Tantangan ini menunjukkan cara membuat fungsi tampilan yang menerima pointer konstan ke struct, sehingga fungsi tersebut tidak dapat mengubah data asli. Kamu akan berlatih menggunakan fgets() untuk membaca string yang berisi spasi, strcspn() untuk menghapus karakter baris baru di akhir, operator panah untuk mengakses anggota struct melalui pointer, strchr() untuk mencari karakter, dan logika percabangan untuk mengategorikan data. Penggunaan const dalam deklarasi parameter merupakan praktik yang baik untuk mencegah perubahan data kontak secara tidak sengaja di dalam fungsi tampilan.
Coba sendiri
#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;
}Semua pelajaran di Logika dan Alur
1Dasar-Dasar Pointer
Apa Itu Pointer?Mendeklarasikan PointerOperator Address-Of (&)Operator Dereference (*)Pointer NULLRekap: Dasar-Dasar Pointer4Proyek: Utilitas Teks Sederhana
Gambaran Umum ProyekMenghitung Karakter2Pointer dan array
Nama array sebagai pointerElemen array dan pointerAritmetika pointerMembandingkan pointerRangkuman: Menelusuri array dengan pointer5Pointer dan Fungsi
Penerusan dengan NilaiMeneruskan Pointer ke FungsiMengubah Variabel melalui PointerContoh Klasik: SwapMeneruskan Array ke FungsiRingkasan: Argumen Pointer Fungsi8Struct dan Pointer
Pointer ke StructOperator Panah (->)Mengirim Struct berdasarkan NilaiMengirim Pointer StructAlokasi Dinamis StructUlasan: Memodifikasi Struct dengan Pointer11Tantangan Rangkuman Akhir
Rangkuman: Penggabungan string DinamisRangkuman: array berisi structRangkuman: Penghitung Frekuensi Kata3Array char dan String
String sebagai array charPenanda akhir nullInput String dengan scanfMenggunakan strlen()Menggunakan strcpy()Menggunakan strcat()Menggunakan strcmp()Ulasan: Fungsi String Dasar6Manajemen Memori
Memori Stack vs. HeapAlokasi Dinamis dengan malloc()Menggunakan sizeof() untuk AlokasiMemeriksa Kegagalan AlokasiMembebaskan Memori dengan free()Alokasi dengan calloc()Ringkasan: array Dinamis9Proyek: Entri Kontak Sederhana
Proyek: Definisikan struct KontakFungsi untuk Membuat KontakLatihan sendiri: Compiler C online