Menu
Coddy logo textTech

Dinamik String Oluşturucu

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 59 / 61.

challenge icon

Görev

Kolay

Bir StringBuilder oluşturalım: metin ekledikçe otomatik olarak büyüyen dinamik bir dize kapsayıcısı. Bu, bu kurs boyunca öğrendiğin OOP kalıplarını dinamik bellek yönetimiyle birleştiren pratik bir yardımcı programdır.

Kodunu üç dosyaya ayıracaksın:

  • stringbuilder.h: Üç üyeye sahip StringBuilder yapısını bildir: bir char* arabelleği, geçerli uzunluk için bir size_t ve toplam kapasite için bir size_t. Bir StringBuilder oluşturmak, ona metin eklemek, son dizeyi almak ve belleği serbest bırakmak için işlev prototiplerini bildir. Include korumaları zorunludur.
  • stringbuilder.c: StringBuilder sistemini uygula:
    • create_stringbuilder: heap üzerinde bir StringBuilder ayırır, arabelleği başlangıçta 16 bayt kapasiteyle başlatır, uzunluğu 0 olarak ayarlar ve arabelleğin boş bir dize olarak (null sonlandırılmış) başlamasını sağlar
    • append: bir StringBuilder işaretçisi ve eklenecek bir dize alır. Gerekli yeni uzunluğu hesapla. Kapasiteyi aşarsa kapasiteyi iki katına çıkar (gerekirse bunu tekrarla) ve arabelleği büyütmek için realloc kullan. Ardından yeni metni strcat kullanarak birleştir
    • get_string: dahili arabelleğe bir işaretçi döndürür (salt okunur erişim)
    • free_stringbuilder: önce arabelleği, ardından StringBuilder yapısının kendisini serbest bırakır
  • main.c: Kaç dize ekleneceğini belirten bir tamsayı oku. Ardından fgets kullanarak her dizeyi oku ve StringBuilder'a ekle. Tüm dizeler eklendikten sonra, get_string kullanarak tamamen oluşturulmuş dizeyi yazdır. Son olarak StringBuilder'ı serbest bırak.

Bu görevde kullanılan iki temel işlev:

  • realloc(ptr, new_size): daha önce ayrılmış bir bellek bloğunun boyutunu değiştirir. Mevcut bloğa bir işaretçi ve bayt cinsinden istenen yeni boyutu alır ve yeniden boyutlandırılmış bloğa (taşınmış olabilir) bir işaretçi döndürür. Arabelleğin büyümesi gerektiğinde bunu append içinde kullan:
    sb->buffer = (char*)realloc(sb->buffer, sb->capacity);
  • fgets(buffer, size, stream): bir giriş akışından bir metin satırını karakter dizisine okur ve yeni satır karakterinde veya size - 1 karakter okunduğunda durur. Yeni satır karakterini arabellekte tutar, bu nedenle onu manuel olarak kaldırman gerekir. Her giriş dizesini okumak için main.c içinde kullan:
    fgets(line, sizeof(line), stdin);
    Sondaki yeni satır karakterini kaldırmak için: son karakterin '\n' olup olmadığını kontrol et ve onu '\0' ile değiştir.

Programın şu girdileri alacak:

  1. Eklenecek dize sayısı
  2. Her dize ayrı bir satırda

Girdiler 3, ardından Hello, , World olduğunda örnek çıktı:

Hello World

Girdiler 4, ardından C, is, a, great language! olduğunda örnek çıktı:

C is a great language!

Girdi 1, ardından SingleString olduğunda örnek çıktı:

SingleString

Her append işleminden sonra length alanını güncellemeyi unutma. Yeniden ayırmanın gerekli olup olmadığını kontrol ederken null sonlandırıcıyı hesaba kat: arabellek için length + new_text_length + 1 baytlık alan gerekir. Dize uzunluklarını ölçmek için strlen içindeki <string.h> işlevini kullan. Ayrıca getchar() ile dizeleri okumadan önce kalan yeni satırı tüketmek için scanf içinde main.c sonrasında fgets çağır.

Kendin dene

#include <stdio.h>
#include <stdlib.h>
#include "stringbuilder.h"

int main() {
    int n;
    scanf("%d", &n);
    getchar(); // sayıdan sonraki satır sonunu tüket
    
    // TODO: Create a StringBuilder using create_stringbuilder()
    
    // TODO: Read n strings and append each to the StringBuilder
    // İpucu: Her satırı okumak için fgets veya benzerini kullan
    // fgets kullanırsan ondan gelen satır sonu karakterini işlemeyi unutma
    
    // TODO: get_string() kullanarak birleştirilmiş tam dizeyi yazdır
    
    // TODO: Free the StringBuilder using free_stringbuilder()
    
    return 0;
}

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi