Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة: String Wrapper

جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 16 من 61.

challenge icon

التحدي

سهل

لنقم ببناء وحدة StringObject تغلف مصفوفة أحرف مخصصة ديناميكيًا. يجمع هذا التحدي التلخيصي دورة حياة الكائن الكاملة - المنشئ (constructor)، والطريقة المخصصة للقراءة فقط (read-only method)، والمدمر (destructor) - وكلها تعمل معًا لإدارة الذاكرة بأمان.

ستقوم بإنشاء ثلاثة ملفات:

  • stringobj.h: قم بالتصريح عن هيكل StringObject مع عضو واحد: char *text (مؤشر إلى سلسلة نصية مخصصة ديناميكيًا). صرح أيضًا عن ثلاث دوال:
    • create_string — تأخذ مدخلاً من نوع const char * وتعيد مؤشرًا إلى StringObject مخصص حديثًا
    • print_string — تأخذ const StringObject * وتعرض النص المخزن
    • free_string — تأخذ StringObject * وتحرر جميع الذاكرة المخصصة
    استخدم حواجز التضمين (include guards) مع الرمز STRINGOBJ_H.
  • stringobj.c: قم بتنفيذ الدوال الثلاث جميعها. يجب أن يقوم المنشئ الخاص بك بتخصيص ذاكرة للهيكل، ثم تخصيص ذاكرة للنص (تذكر strlen زائد واحد للمنتهي الصفري)، ونسخ سلسلة الإدخال. يجب أن يقوم المدمر الخاص بك بالتحرير بترتيب عكسي - مخزن text الداخلي أولاً، ثم الهيكل نفسه. قم بتضمين فحص NULL في المدمر الخاص بك من أجل السلامة.
  • main.c: استخدم الوحدة الخاصة بك لإنشاء كائن سلسلة، وعرض محتوياته، ثم التنظيف بشكل صحيح.

ستتلقى مدخلاً واحدًا: سلسلة نصية لتخزينها في StringObject الخاص بك.

في ملفك الرئيسي، قم بإنشاء StringObject بالنص المقدم، واطبع محتوياته، وحرر الذاكرة، ثم اطبع رسالة تأكيد.

يجب أن تقوم دالة print_string بالإخراج بهذا التنسيق:

Text: {text}

بعد التحرير، اطبع:

Freed

على سبيل المثال، مع المدخل Hello World، سيكون المخرج:

Text: Hello World
Freed

جرّب بنفسك

#include <stdio.h>
#include "stringobj.h"

int main() {
    char input[256];
    fgets(input, sizeof(input), stdin);
    
    // إزالة سطر جديد إذا كان موجوداً
    int len = 0;
    while (input[len] != '\0') len++;
    if (len > 0 && input[len - 1] == '\n') {
        input[len - 1] = '\0';
    }
    
    // TODO: إنشاء StringObject بنص الإدخال
    
    // TODO: طباعة السلسلة النصية باستخدام print_string
    
    // TODO: تحرير الـ StringObject باستخدام free_string
    
    // TODO: طباعة "Freed" لتأكيد عملية التنظيف
    
    return 0;
}

جميع دروس Object Oriented Programming