Perakit string Dinamis
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 59 dari 61.
Tantangan
MudahMari buat StringBuilder: wadah string dinamis yang bertambah secara otomatis saat kamu menambahkan teks. Ini adalah utilitas praktis yang menggabungkan pengelolaan memori dinamis dengan pola OOP yang telah kamu kuasai sepanjang kursus ini.
Kamu akan mengatur kodemu dalam tiga file:
stringbuilder.h: Deklarasikan structStringBuilderdengan tiga anggota: bufferchar*, sebuahsize_tuntuk panjang saat ini, dan sebuahsize_tuntuk kapasitas total. Deklarasikan prototipe fungsi untuk membuat StringBuilder, menambahkan teks ke dalamnya, mengambil string akhir, dan membebaskan memorinya. Include guard sangat penting.stringbuilder.c: Implementasikan sistem StringBuilder-mu:create_stringbuilder: mengalokasikan StringBuilder di heap, menginisialisasi buffer dengan kapasitas awal 16 byte, mengatur panjang ke 0, dan memastikan buffer dimulai sebagai string kosong (diakhiri dengan null)append: menerima pointer StringBuilder dan string untuk ditambahkan. Hitung panjang baru yang dibutuhkan. Jika melebihi kapasitas, gandakan kapasitas (berulang kali jika diperlukan) dan gunakanreallocuntuk memperbesar buffer. Lalu gabungkan teks baru menggunakanstrcatget_string: mengembalikan pointer ke buffer internal (akses hanya-baca)free_stringbuilder: membebaskan buffer terlebih dahulu, lalu struct StringBuilder itu sendiri
main.c: Baca bilangan bulat yang menunjukkan jumlah string yang akan ditambahkan. Lalu baca setiap string menggunakanfgetsdan tambahkan ke StringBuilder-mu. Setelah semua string ditambahkan, cetak string gabungan lengkap menggunakanget_string. Terakhir, bebaskan StringBuilder.
Dua fungsi penting yang digunakan dalam tantangan ini:
realloc(ptr, new_size): mengubah ukuran blok memori yang sebelumnya dialokasikan. Fungsi ini menerima pointer ke blok yang ada dan ukuran baru yang diinginkan dalam byte, lalu mengembalikan pointer ke blok yang ukurannya telah diubah (yang mungkin berpindah). Gunakan fungsi ini diappendsaat buffer perlu diperbesar:sb->buffer = (char*)realloc(sb->buffer, sb->capacity);fgets(buffer, size, stream): membaca satu baris teks dari aliran input ke dalam array karakter, berhenti saat menemukan baris baru atau setelah membacasize - 1karakter. Fungsi ini menyimpan karakter baris baru di dalam buffer, jadi kamu perlu menghapusnya secara manual. Gunakan fungsi ini dimain.cuntuk membaca setiap string input:fgets(line, sizeof(line), stdin);
Untuk menghapus karakter baris baru di akhir: periksa apakah karakter terakhir adalah'\n'dan ganti dengan'\0'.
Programmu akan menerima:
- Jumlah string yang akan ditambahkan
- Setiap string pada baris terpisah
Contoh output saat inputnya adalah 3, lalu Hello, , World:
Hello WorldContoh output saat inputnya adalah 4, lalu C, is, a, great language!:
C is a great language!Contoh output saat inputnya adalah 1, lalu SingleString:
SingleStringIngat untuk memperbarui field length setelah setiap operasi append. Saat memeriksa apakah perlu melakukan realokasi, perhitungkan terminator null: buffer memerlukan ruang sebanyak length + new_text_length + 1 byte. Gunakan strlen dari <string.h> untuk mengukur panjang string. Selain itu, panggil getchar() setelah scanf di main.c untuk menggunakan karakter baris baru yang tersisa sebelum membaca string dengan fgets.
Coba sendiri
#include <stdio.h>
#include <stdlib.h>
#include "stringbuilder.h"
int main() {
int n;
scanf("%d", &n);
getchar(); // ambil karakter baris baru setelah angka
// TODO: Buat StringBuilder menggunakan create_stringbuilder()
// TODO: Baca n string dan tambahkan masing-masing ke StringBuilder
// Petunjuk: Gunakan fgets atau fungsi serupa untuk membaca setiap baris
// Ingat untuk menangani karakter baris baru dari fgets jika kamu menggunakannya
// TODO: Cetak string lengkap yang telah disusun menggunakan get_string()
// TODO: Bebaskan memori StringBuilder menggunakan free_stringbuilder()
return 0;
}
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar Pemrograman Modular
file headerProteksi includefile sumberFungsi StatisRingkasan: Kalkulator Modular4Enkapsulasi
Konsep Opaque PointerMendefinisikan Opaque StructGetter dan SetterValidasi pada SetterUlasan: Kotak Rahasia2Object dan method
Struct sebagai objectPointer 'self'Konsistensi constPointer vs nilaiMethod pembantuRangkuman: Pengelola Point5Proyek: Akun Bank Sederhana
Penyiapan ProyekImplementasi Akun3Siklus Hidup object
Pola KonstruktorPola DestruktorInisialisasi StackSalinan MendalamRangkuman: Pembungkus string6Pewarisan melalui Komposisi
Penyematan StructAturan Anggota PertamaMengakses Anggota ParentUpcastingRekap: Hierarki Bentuk9Proyek: Penggambar Bentuk
Ringkasan ProyekImplementasi LingkaranImplementasi Persegi PanjangPenggunaan PolimorfismeWadah BentukLatihan sendiri: Compiler C online