المصفوفة أحادية البعد One Dimensional Array (4) - مصفوفة الأحرف
غالبًا ما يُشار إلى مجموعة من الأحرف في لغة C++ باسم "string". إنها بنية بيانات أساسية تستخدم لتخزين تسلسلات من الأحرف، مثل الكلمات أو الجمل أو حتى الأحرف الفردية. في لغة C++، يتم تمثيل الـstrings كمصفوفات من الأحرف، تنتهي بحرف فارغ خاص، '\0'، والذي يشير إلى نهاية الـstring.
لبدء حرف نستخدم اقتباسًا واحدًا مثل 'L'.
مثال 1:
char ch[5] = { 'a','b','c','d','e','\0' };
يُستخدم الحرف الفارغ ('\0') أو NULL أو 0 للإشارة إلى نهاية الـstring. تتم إضافة هذا الحرف تلقائيًا إلى نهاية الـstringالحرفي وهو ضروري لوظائف معالجة السلسلة المختلفة.
إذا قمت بإضافة أحرف بعد الحرف الفارغ فلن يقرأها البرنامج.
مثال 2:
#include <iostream> using namespace std; int main() { char ch[5]; cin >> ch; cout << ch << endl; return 0; }
يقرأ هذا الكود سلسلة من الأحرف في مصفوفة char ثم يطبع المصفوفة. ومع ذلك، هناك بعض الأشياء التي يجب ملاحظتها حول المشكلات والتحسينات المحتملة في الكود:
- حجم المصفوفة:
يبلغ حجم مصفوفة (char) 5. إذا قمت بإدخال أكثر من 4 أحرف، فسيؤدي ذلك إلى تجاوز سعة المخزن المؤقت، مما يتسبب في سلوك غير محدد. من الضروري التأكد من أن الإدخال لا يتجاوز حجم المصفوفة. - طريقة الادخال:
عند استخدام cin >> ch، فإنه يقرأ الأحرف حتى يواجه مسافة بيضاء. إذا كنت تريد قراءة سطر كامل (بما في ذلك المسافات)، فيجب عليك استخدام cin.getline(ch, size) أو cin.get(ch, size).
مثال 3:
#include <iostream> using namespace std; int main() { char ch[10]; // Read up to 9 characters into the char array cin.get(ch, 10); // Output the char array cout << ch << endl; return 0; }
يقرأ هذا الكود ما يصل إلى 9 أحرف (بالإضافة إلى الحرف الفارغ) في مصفوفة char باستخدام cin.get() ثم يطبع المصفوفة.
فيما يلي بعض النقاط التي يجب ملاحظتها:
- حجم المصفوفة:
يبلغ حجم مصفوفة (char ch) 10. وبما أن cin.get() يقرأ ما يصل إلى واحد أقل من الحجم المحدد (مع ترك مساحة للحرف الفارغ)، فإنه يقرأ بشكل فعال ما يصل إلى 9 أحرف. - طريقة الادخال:
يقرأ cin.get(ch, 10) الأحرف حتى تتم قراءة 9 أحرف، أو يتم العثور على حرف السطر الجديد، أو الوصول إلى نهاية الملف. ويتوقف عن القراءة بعد الوصول إلى عدد الأحرف المحدد أو مواجهة أحد هذه الشروط. - الحرف الفارغ NULL:
لم يتم إنهاء المصفوفة بشكل صريح بواسطة cin.get(); ومع ذلك، تقوم تدفقات C++ تلقائيًا بإلحاق حرف فارغ في نهاية الـstring عند القراءة في مصفوفة أحرف. لذلك، يتم التعامل مع المصفوفة ch بشكل فعال كـstring من النمط C.
المخرجات:
cout << ch << endl; يطبع محتويات مصفوفة char، ويعاملها كـstring منتهي بقيمة خالية. إذا تم إدخال أقل من 9 أحرف، فسيتم طباعة الأحرف التي تم إدخالها. إذا تم إدخال 9 أحرف، فسيتم طباعة تلك الأحرف التسعة متبوعة بالحرف الفارغ.
محددات المدخلات:
ضع في اعتبارك أن إدخال المستخدم يقتصر على 9 أحرف، وقد يؤدي تجاوز هذا الحد إلى سلوك غير متوقع. من الضروري التعامل مع تجاوزات المدخلات المحتملة بناءً على المتطلبات المحددة لبرنامجك.
مثال 4:
#include <iostream> using namespace std; int main() { char ch1[10], ch2[10]; cin.getline(ch1, 10); cin.getline(ch2, 10); cout << ch1 << endl; cout << ch2 << endl; return 0; }
يقرأ هذا الكود سطرين من الإدخال في مصفوفات char منفصلة ثم يطبع كل مصفوفة على سطر جديد.
فيما يلي بعض النقاط التي يجب ملاحظتها:
- حجم المصفوفة:
كل من ch1 و ch2 عبارة عن مصفوفات char بحجم 10. تقرأ الدالة cin.getline() الأحرف حتى تواجه حرف السطر الجديد أو تصل إلى الحجم المحدد (مع ترك مساحة للحرف الفارغ). - محددات المدخلات:
يقتصر إدخال المستخدم لكل سطر على 9 أحرف، وتتم إضافة الحرف الفارغ تلقائيًا بواسطة cin.getline(). - مساحات التسليم:
على عكس cin >>، يقرأ cin.getline() السطر بأكمله، بما في ذلك المسافات. هذا يسمح لك بإدخال strings بمسافات.
المخرجات:
cout << ch1 << endl; يطبع محتويات مصفوفة الأحرف الأولى، ويتعامل معها على أنها string منتهية بقيمة خالية.
وبالمثل، cout << ch2 << endl; يطبع محتويات مصفوفة char الثانية.
حرف السطر الجديد:
تتم قراءة كل استدعاء إلى cin.getline() حتى يواجه حرف السطر الجديد أو يصل إلى الحجم المحدد. يتم استهلاك حرف السطر الجديد ولكن لا يتم تخزينه في المصفوفات.
يتيح لك هذا الكود إدخال سطرين من النص (يصل كل منهما إلى 9 أحرف) ثم طباعة كل سطر على سطر جديد. إنها مناسبة لقراءة وعرض أسطر متعددة من النص، ومعالجة المسافات، وتجنب مشكلات تجاوز سعة المخزن المؤقت.
هناك بعض الدوال التي تعد جزءًا من مكتبة C القياسية وتستخدم لمعالجة strings نمط C، وهي عبارة عن مصفوفات من الأحرف. وفيما يلي شرح لكل دالة:
- strcpy (نسخ String):
الوصف: يتم استخدام الدالة strcpy لنسخ محتويات string نمط C إلى string آخر.
مثال:
#include <iostream> #include <cstdlib> using namespace std; int main() { char ch1[] = "AAA"; char ch2[4]; strcpy_s(ch2, ch1); cout << ch2 << endl; return 0; }
- دالة strcpy_s:
تعد الدالة strcpy_s جزءًا من مكتبة C القياسية وهي مصممة لتوفير نسخ أكثر أمانًا للـstring من خلال تضمين التحقق من الحجم. - حجم المخزن:
يتم تحديد حجم ch2 بشكل صريح على أنه 4، والذي يتضمن ثلاثة أحرف لمحتوى ch1 ("AAA") ومسافة إضافية واحدة للحرف الفارغ ('\0'). - نسخة الـString الآمنة:
على عكس الدالة strcpy القياسية، تتطلب strcpy_s منك توفير حجم المصفوفة (destsz). يتحقق مما إذا كانت هناك مساحة كافية في المصفوفة لاستيعاب الـstring المصدر والحرف الفارغ. إذا لم تكن هناك مساحة كافية، فلن تقوم الدالة بالنسخ وتقوم بإرجاع رمز خطأ.
المخرجات:
cout << ch2 << endl; تقوم بإخراج محتويات ch2، والتي يجب أن تكون "AAA" في هذه الحالة.
باستخدام strcpy_s، فإنك تتخذ خطوات لمنع مشكلات تجاوز سعة المخزن المؤقت التي قد تحدث إذا لم تكن المصفوفة كبيرة بما يكفي لاستيعاب محتويات الـstring المصدر. هذه ممارسة جيدة لتعزيز أمان ومتانة التعليمات البرمجية الخاصة بك.
- strcat (دمج String):
الوصف: يتم استخدام الدالة strcat لـدمج (إلحاق) محتويات string نمط C بسلسلة أخرى.
مثال:
#include <iostream> #include <cstdlib> using namespace std; int main() { char ch1[] = "AAA"; char ch2[4] = "HH"; strcat(ch2, ch1); cout << ch2 << endl; return 0; }
- دالة strcat:
تعد الدالة strcat جزءًا من مكتبة C القياسية وتُستخدم لدمج محتويات string نمط C بـstring آخر. - حجم المخزن:
يتم تحديد حجم ch2 بشكل صريح على أنه 4، والذي يتضمن حرفين ("HH") ومسافة إضافية واحدة لـ('\0'). - الدمج Concatenation:
strcat(ch2, ch1); يقوم بإلحاق محتويات ch1 بنهاية ch2. يبدأ بنسخ الأحرف من null terminator لـ ch2 إلى نهاية ch1 حتى يواجه الـ null terminator للـ ch1. يتم تحديث الـ null terminator لـ ch2 وفقًا لذلك.
المخرجات:
cout << ch2 << endl; تقوم العبارة بإخراج محتويات ch2 بعد الدمج. نظرًا لأن حجم ch2 محدد بـ 4، فيمكنه الاحتفاظ بـ "HH" والـnull terminator, ولكن يمكن استيعاب حرف إضافي واحد فقط من ch1 ("A").
Result:
ناتج هذا الكود هو "HHA"، وهو نتيجة لدمج "AAA" إلى نهاية المحتوى الموجود في ch2.
من المهم التأكد من أن المصفوفة بها مساحة كافية لاستيعاب الـstring الذي تم دمجه، واستخدام دوال مثل strcat يتطلب إدارة دقيقة لأحجام المخزن المؤقت لمنع تجاوز سعة المخزن المؤقت.
- strcmp (مقارنة String):
الوصف: يتم استخدام الدالة strcmp لمقارنة اثنان من الـ strings من نمط C بشكل معجمي.
ترجع الدالة strcmp قيمة عددية تشير إلى العلاقة المعجمية بين الـ strings الاثنين. يُرجع:
- 0 إذا كانت الـstrings متساوية،
- قيمة سالبة إذا كانت str1 أقل معجميًا من str2،
– قيمة موجبة إذا كانت str1 أكبر من الناحية المعجمية str2.
مثال:
#include <iostream> #include <cstdlib> using namespace std; int main() { cout << strcmp("abc", "abc") << endl; return 0; }
المخرجات:
تقوم عبارة cout بإخراج نتيجة المقارنة باستخدام strcmp. في هذه الحالة، بما أن الـstrings متساوية، فسيكون الناتج 0.
تُستخدم الدالة strcmp بشكل شائع لفرز الـstrings وعمليات القاموس والسيناريوهات الأخرى التي تحتاج فيها إلى تحديد الترتيب المعجمي للـstrings. من المهم التعامل مع النتيجة بشكل مناسب بناءً على متطلباتك المحددة في البرنامج.
- strlen (طول String):
الوصف: يتم استخدام الدالة strlen لتحديد طول string نمط C.
مثال:
#include <iostream> #include <cstdlib> using namespace std; int main() { char ch[] = "jjjjjjjjjjjjjjjjjjjjj"; cout << strlen(ch) << endl; return 0; }
المخرجات:
تقوم عبارة cout بإخراج نتيجة strlen(ch)، وهي طول الـstring النصية “jjjjjjjjjjjjjjjjjjjjj”. نظرًا لوجود 21 حرفًا في الـstring، سيكون الناتج 21.
تعتبر الدالة strlen مفيدة للحصول على طول الـstring النصية، ومن المهم ملاحظة أن الطول لا يتضمن الحرف الفارغ. تأكد من أن الـstring منتهي بشكل صحيح للحصول على نتائج دقيقة باستخدام strlen.