Menu
CoddyTech

Perakit string Dinamis

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 59 dari 61.

challenge icon

Tantangan

Mudah

Mari 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 struct StringBuilder dengan tiga anggota: buffer char*, sebuah size_t untuk panjang saat ini, dan sebuah size_t untuk 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 gunakan realloc untuk memperbesar buffer. Lalu gabungkan teks baru menggunakan strcat
    • get_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 menggunakan fgets dan tambahkan ke StringBuilder-mu. Setelah semua string ditambahkan, cetak string gabungan lengkap menggunakan get_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 di append saat 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 membaca size - 1 karakter. Fungsi ini menyimpan karakter baris baru di dalam buffer, jadi kamu perlu menghapusnya secara manual. Gunakan fungsi ini di main.c untuk 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:

  1. Jumlah string yang akan ditambahkan
  2. Setiap string pada baris terpisah

Contoh output saat inputnya adalah 3, lalu Hello, , World:

Hello World

Contoh output saat inputnya adalah 4, lalu C, is, a, great language!:

C is a great language!

Contoh output saat inputnya adalah 1, lalu SingleString:

SingleString

Ingat 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

Latihan sendiri: Compiler C online