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

استخدام strcat()

جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 17 من 63.

لقد تعلمت كيفية نسخ السلاسل النصية باستخدام strcpy()، ولكن ماذا لو كنت تريد دمج سلسلتين نصيتين معاً؟ يُسمى هذا الدمج (concatenation)، وتوفر لغة C دالة strcat() من مكتبة <string.h> لهذا الغرض.

تقوم الدالة strcat() بإلحاق محتويات سلسلة نصية واحدة بنهاية سلسلة نصية أخرى. وهي تأخذ وسيطين: السلسلة النصية الوجهة (التي سيتم تعديلها) والسلسلة النصية المصدر (التي ستتم إضافتها إلى النهاية).

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

char greeting[20] = "Hello";
char name[] = " World";
strcat(greeting, name);  // يحتوي greeting الآن على "Hello World"

من الضروري أن تحتوي السلسلة النصية الوجهة (destination string) على مساحة كافية لاستيعاب كل من المحتوى الأصلي والمحتوى الجديد الذي يتم إلحاقه. تقوم الدالة strcat() بالعثور على النهاية الصفرية (null terminator) في السلسلة النصية الوجهة، وتقوم بإزالتها، ثم تنسخ السلسلة النصية المصدر إلى ذلك الموقع، وتضيف نهاية صفرية جديدة في النهاية تماماً.

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

في بعض الأحيان تحتاج إلى تحويل رقم إلى سلسلة نصية قبل أن تتمكن من دمجه. لهذا الغرض، يمكنك استخدام sprintf() من <stdio.h> (المضمنة بالفعل في معظم برامج C). تعمل sprintf() تماماً مثل printf()، ولكن بدلاً من الطباعة على الشاشة، فإنها تكتب النتيجة المنسقة في مصفوفة أحرف (char array).


على سبيل المثال، لتحويل عدد صحيح إلى سلسلة نصية:

int age = 25;
char ageStr[10];
sprintf(ageStr, "%d", age);  // تحتوي ageStr الآن على "25"

char result[30] = "Age: ";
strcat(result, ageStr);       // تحتوي result الآن على "Age: 25"

المعامل الأول لـ sprintf() هو مصفوفة الأحرف الوجهة، والثاني هو سلسلة التنسيق (باستخدام نفس محددات التنسيق مثل printf())، والمعاملات المتبقية هي القيم المراد إدراجها.
challenge icon

التحدي

سهل

اكتب برنامجاً بلغة C يوضح عملية دمج السلاسل النصية باستخدام دالة strcat() لبناء رسائل مخصصة. يجب على برنامجك القيام بما يلي:

  1. قراءة عدد صحيح n يمثل عدد الأشخاص الذين سيتم معالجتهم
  2. لكل شخص:
    • قراءة الاسم الأول من الإدخال
    • قراءة اسم العائلة من الإدخال
    • إنشاء مصفوفة أحرف باسم fullName تحتوي على 100 عنصر
    • استخدام strcpy() لنسخ الاسم الأول إلى fullName
    • استخدام strcat() لإلحاق مسافة واحدة " " بـ fullName
    • استخدام strcat() لإلحاق اسم العائلة بـ fullName
    • إنشاء مصفوفة أحرف باسم greeting تحتوي على 150 عنصراً
    • استخدام strcpy() لنسخ "Hello, " إلى greeting
    • استخدام strcat() لإلحاق fullName بـ greeting
    • استخدام strcat() لإلحاق "! Welcome to our program." بـ greeting
    • طباعة رسالة الترحيب النهائية
  3. بعد معالجة جميع الأشخاص، قم بإنشاء رسالة ملخص:
    • إنشاء مصفوفة أحرف باسم summary تحتوي على 100 عنصر
    • استخدام strcpy() لنسخ "Total people processed: " إلى summary
    • تحويل الرقم n إلى سلسلة نصية واستخدام strcat() لإلحاقه بـ summary
    • طباعة رسالة الملخص

تذكر تضمين ملف الترويسة <string.h> لاستخدام دوال السلاسل النصية.

يجب أن يعرض مخرجك النتائج بالتنسيق التالي:

Hello, [FirstName LastName]! Welcome to our program.
Hello, [FirstName LastName]! Welcome to our program.
...
Total people processed: [n]

على سبيل المثال، إذا كان الإدخال هو:

2
John
Doe
Alice
Smith

يجب أن يكون مخرجك:

Hello, John Doe! Welcome to our program.
Hello, Alice Smith! Welcome to our program.
Total people processed: 2

يختبر هذا التحدي فهمك لاستخدام strcat() لدمج سلاسل نصية متعددة معاً، ودمجها مع strcpy() لإعداد السلسلة النصية الأولية، وبناء سلاسل نصية معقدة من مكونات متعددة خطوة بخطوة.

ورقة مرجعية

تقوم الدالة strcat() من المكتبة <string.h> بربط (دمج) سلسلتين نصيتين عن طريق إلحاق السلسلة المصدر بنهاية السلسلة الوجهة.

الصيغة: strcat(destination, source)

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

char greeting[20] = "Hello";
char name[] = " World";
strcat(greeting, name);  // greeting تحتوي الآن على "Hello World"

هام: يجب أن تحتوي السلسلة الوجهة على مساحة كافية لاستيعاب كل من المحتوى الأصلي والمحتوى الملحق. تقوم الدالة بالعثور على النهاية الصفرية (null terminator) في الوجهة، وإزالتها، ونسخ السلسلة المصدر إلى ذلك الموقع، ثم إضافة نهاية صفرية جديدة في النهاية.

تعمل الدالة sprintf() من المكتبة <stdio.h> مثل printf()، ولكنها تكتب النتيجة المنسقة في مصفوفة أحرف (سلسلة نصية) بدلاً من طباعتها. وهذا يجعلها مفيدة لتحويل الأعداد الصحيحة (أو القيم الأخرى) إلى سلاسل نصية.

الصيغة: sprintf(destination, format, value)

#include <stdio.h>

int num = 42;
char numStr[10];
sprintf(numStr, "%d", num);  // numStr تحتوي الآن على "42"

هام: يجب أن تكون مصفوفة الوجهة كبيرة بما يكفي لاستيعاب السلسلة الناتجة، بما في ذلك النهاية الصفرية.

جرّب بنفسك

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

int main() {
    // قراءة عدد الأشخاص
    int n;
    scanf("%d", &n);
    
    // TODO: اكتب كودك أدناه
    // معالجة كل شخص وإنشاء رسائل ترحيب
    // ثم إنشاء وعرض رسالة الملخص
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow