Dinamik String Oluşturucu
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 59 / 61.
Görev
KolayBir 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 sahipStringBuilderyapısını bildir: birchar*arabelleği, geçerli uzunluk için birsize_tve toplam kapasite için birsize_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ğlarappend: 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çinreallockullan. Ardından yeni metnistrcatkullanarak birleştirget_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ındanfgetskullanarak her dizeyi oku ve StringBuilder'a ekle. Tüm dizeler eklendikten sonra,get_stringkullanarak 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 bunuappendiç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 veyasize - 1karakter okunduğunda durur. Yeni satır karakterini arabellekte tutar, bu nedenle onu manuel olarak kaldırman gerekir. Her giriş dizesini okumak içinmain.ciç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:
- Eklenecek dize sayısı
- Her dize ayrı bir satırda
Girdiler 3, ardından Hello, , World olduğunda örnek çıktı:
Hello WorldGirdiler 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ı:
SingleStringHer 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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil HiyerarşisiKendi başına pratik yap: Online C derleyicisi