استخدام 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())، والمعاملات المتبقية هي القيم المراد إدراجها.التحدي
سهلاكتب برنامجاً بلغة C يوضح عملية دمج السلاسل النصية باستخدام دالة strcat() لبناء رسائل مخصصة. يجب على برنامجك القيام بما يلي:
- قراءة عدد صحيح
nيمثل عدد الأشخاص الذين سيتم معالجتهم - لكل شخص:
- قراءة الاسم الأول من الإدخال
- قراءة اسم العائلة من الإدخال
- إنشاء مصفوفة أحرف باسم
fullNameتحتوي على 100 عنصر - استخدام
strcpy()لنسخ الاسم الأول إلىfullName - استخدام
strcat()لإلحاق مسافة واحدة " " بـfullName - استخدام
strcat()لإلحاق اسم العائلة بـfullName - إنشاء مصفوفة أحرف باسم
greetingتحتوي على 150 عنصراً - استخدام
strcpy()لنسخ "Hello, " إلىgreeting - استخدام
strcat()لإلحاقfullNameبـgreeting - استخدام
strcat()لإلحاق "! Welcome to our program." بـgreeting - طباعة رسالة الترحيب النهائية
- بعد معالجة جميع الأشخاص، قم بإنشاء رسالة ملخص:
- إنشاء مصفوفة أحرف باسم
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;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية