0Pricing
C Academy · درس

strlen وstrcpy وstrcat

دوال السلاسل الأساسية

strlen وstrcpy وstrcat درس مجاني في C Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.

السلاسل النصية في C

في C، السلسلة النصية مجرد مصفوفة من char تنتهي بحرف خاص هو محرف الإنهاء الصفري '\0'.

تعتمد الدوال الموجودة في <string.h> على هذا المحرف لمعرفة نهاية السلسلة النصية. ومن دونه، ستقرأ بعد نهاية المصفوفة.

#include <stdio.h>

int main(void) {
    char name[] = "Alice";
    printf("%s\n", name);
    printf("Bytes used: %lu\n", sizeof(name));
    return 0;
}

تضمين string.h

لاستخدام دوال السلاسل النصية، يجب تضمين ملف الترويسة:

  • #include <string.h>

يوفر لك ذلك الدوال strlen وstrcpy وstrcat وstrcmp وغيرها.

#include <stdio.h>
#include <string.h>

int main(void) {
    char greeting[] = "Hello";
    printf("Length is %lu\n", strlen(greeting));
    return 0;
}

strlen: عدّ المحارف

تُرجع strlen عدد المحارف قبل محرف الإنهاء الصفري. ولا تحسب '\0' نفسه.

لذلك تُرجع strlen("cat") القيمة 3، رغم أن المصفوفة تشغل 4 بايتات.

#include <stdio.h>
#include <string.h>

int main(void) {
    char word[] = "cat";
    printf("strlen = %lu\n", strlen(word));
    printf("sizeof = %lu\n", sizeof(word));
    return 0;
}

strlen ذات تعقيد O(n)

لأن سلاسل C النصية لا تخزّن طولها، يجب على strlen المرور عبر كل محرف حتى تعثر على '\0'.

يجعلها ذلك عملية ذات تعقيد O(n). تجنّب استدعاءها بصورة متكررة داخل شرط حلقة عند التعامل مع سلاسل نصية كبيرة.

#include <stdio.h>
#include <string.h>

int main(void) {
    char msg[] = "programming";
    size_t len = strlen(msg);
    for (size_t i = 0; i < len; i++) {
        printf("%c", msg[i]);
    }
    printf("\n");
    return 0;
}

strcpy: نسخ السلاسل النصية

لا يمكنك نسخ السلاسل النصية باستخدام =. استخدم strcpy(dest, src) لنسخ src إلى dest، بما في ذلك محرف الإنهاء الصفري.

يجب أن يكون الوجهة كبيرة بما يكفي لاحتواء المصدر بالإضافة إلى محرف الإنهاء.

#include <stdio.h>
#include <string.h>

int main(void) {
    char src[] = "Hello";
    char dest[20];
    strcpy(dest, src);
    printf("%s\n", dest);
    return 0;
}

خطر فيضان المخزن المؤقت في strcpy

إذا كانت dest صغيرة جدًا، فستكتب strcpy بعد نهاية المخزن المؤقت، مما يؤدي إلى إتلاف الذاكرة. وهذا خطأ أمني شائع.

فضّل استخدام strncpy(dest, src, n) التي تنسخ n بايتات كحد أقصى. ملاحظة: قد لا تضيف strncpy محرف الإنهاء الصفري إذا كان src طويلًا جدًا.

#include <stdio.h>
#include <string.h>

int main(void) {
    char src[] = "LongString";
    char dest[5];
    strncpy(dest, src, 4);
    dest[4] = '\0';
    printf("%s\n", dest);
    return 0;
}

strcat: ضم السلاسل النصية

تُلحق strcat(dest, src) قيمة src بنهاية dest. وتبدأ الكتابة عند المُنهي الصفري في dest، ثم تضيف مُنهياً صفرياً جديداً في النهاية.

يجب أن تكون dest سلسلة نصية صالحة مسبقاً، وأن تتوفر فيها مساحة حرة كافية.

#include <stdio.h>
#include <string.h>

int main(void) {
    char buffer[20] = "Hello, ";
    strcat(buffer, "World");
    printf("%s\n", buffer);
    return 0;
}

إنشاء السلاسل النصية خطوة بخطوة

يمكنكم ربط استدعاءات strcpy وstrcat لإنشاء سلسلة نصية جزءاً بعد جزء.

ابدؤوا دائماً بمخزن مؤقت مهيّأ، حتى يجد أول استدعاء لـ strcat مُنهياً صالحاً.

#include <stdio.h>
#include <string.h>

int main(void) {
    char full[50];
    strcpy(full, "Mr. ");
    strcat(full, "John ");
    strcat(full, "Smith");
    printf("%s\n", full);
    return 0;
}

ضم أكثر أماناً باستخدام strncat

تلحق strncat(dest, src, n) بحد أقصى n محارف من src، ثم تضيف دائماً مُنهياً صفرياً.

يساعد ذلك على منع تجاوزات السعة عندما يكون طول المصدر غير معروف.

#include <stdio.h>
#include <string.h>

int main(void) {
    char dest[16] = "Data: ";
    char src[] = "1234567890";
    strncat(dest, src, 5);
    printf("%s\n", dest);
    return 0;
}

القيم المُعادة

يعيد كل من strcpy وstrcat مؤشراً إلى dest. يتيح ذلك تداخل الاستدعاءات، لكنه قد يقلل من سهولة قراءة الشيفرة.

تعيد strlen قيمة من النوع size_t، وهو نوع غير موقّع. احذروا عند مقارنتها بأعداد صحيحة موقّعة.

#include <stdio.h>
#include <string.h>

int main(void) {
    char a[20] = "foo";
    char b[] = "bar";
    printf("%s\n", strcat(a, b));
    return 0;
}

خطأ شائع في تخصيص الذاكرة

من الأخطاء الشائعة نسيان إضافة +1 للمُنهي الصفري عند تحديد حجم المخزن المؤقت.

تحتاج سلسلة طولها n إلى n + 1 بايت. وطول سلسلتين مضمومتين معاً هو strlen(a) + strlen(b) + 1.

#include <stdio.h>
#include <string.h>

int main(void) {
    char a[] = "abc";
    char b[] = "de";
    size_t needed = strlen(a) + strlen(b) + 1;
    printf("Need %lu bytes\n", needed);
    return 0;
}

تحقق سريع

اختبروا فهمكم لأطوال السلاسل النصية.

مراجعة

تعلّمتم الدوال الأساسية من string.h:

  • تحسب strlen عدد المحارف التي تسبق '\0' ‏(O(n)).
  • تنسخ strcpy سلسلة نصية؛ ويجب أن تكون الوجهة كبيرة بما يكفي.
  • تلحق strcat نصاً بسلسلة نصية موجودة.
  • احجزوا دائماً مساحة للمُنهي الصفري، وفضّلوا المتغيرات strn* لمزيد من الأمان.

الأسئلة الشائعة

هل درس «strlen وstrcpy وstrcat» مجاني؟

نعم — نص درس «strlen وstrcpy وstrcat» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.

ماذا ستتعلم في «strlen وstrcpy وstrcat»؟

دوال السلاسل الأساسية تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟

لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «strlen وstrcpy وstrcat»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟

نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. strlen وstrcpy وstrcat
  2. strcmp والمقارنة
  3. strtok وتقسيم الرموز
  4. memcpy وmemset
← العودة إلى C Academy