مفهوم السلاسل


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

  1. الأولى هي الصف `نـص` (String) الذي تم إنشاؤه في الأسس.
  2. الثانية من خلال الصنف `مؤشر[مصفوفة[مـحرف]]` (ptr[array[Char]]).

الصنف `نـص` (String)


يسهل هذا الصنف التعامل مع سلاسل المحارف فهو يتولى مسؤولية حجز وتحرير الذاكرة الخاصة بسلسلة المحارف مع مراعاة الأداء وتجنب عمليات النسخ وحجز الذاكرة غير الضرورية. إضافةً لاحتوائه على العديد من الدوال المساعدة، و هو موجود ضمن مكتبة التنفيذ المعيارية `مـتم` (Srl) لذلك لابد من تضمينها قبل محاولة تعريف متغيرات من هذا الصف.

- يمكنك تعريف وتهيئة سلسلة من الصنف `نـص` (String) بالشكل التالي:

اشمل "مـتم/نـص"؛ // نقوم بدايةً بتضمين الصنف
عرف اسم_النص: مـتم.نـص = "قيمة مبدئية"؛ // تعريف سلسلة نصية
import "Srl/String.alusus";  // نقوم بدايةً بتضمين الصنف
def srting_name: String = "Initial Value"; // تعريف سلسلة نصية

حيث أن القيمة المبدئية هي قيمة ابتدائية اختيارية للمتغير `اسم_النص`. ولا ننسى وضع السلسلة بين علامتي اقتباس.

مثال:
تعريف وطباعة سلسلة نصية بأشكال مختلفة.

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف نص: نـص = "الأسس"؛
طـرفية.اطبع(نص)؛ // الأسس
// وفي حالة أردت أن تقوم بطباعتها مع بعض العبارات التوضيحية يمكنك
// القيام بذلك كما يأتي
طـرفية.اطبع(نـص("اللغة: ") + نص)؛ // اللغة: الأسس
// كما يمكنك تنفيذ عملية الطباعة بالشكل التالي من خلال العنصر النائب s
طـرفية.اطبع("اللغة: %s"، نص.صوان)؛
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def str: String="Alusus";
Console.print(str); // Alusus
// وفي حالة أردت أن تقوم بطباعتها مع بعض العبارات التوضيحية يمكنك
// القيام بذلك كما يأتي
Console.print(String("language: ") + str); // language: Alusus
// s كما يمكنك تنفيذ عملية الطباعة بالشكل التالي من خلال العنصر النائب
Console.print("language: %s", str.buf); // language: Alusus

لكن لاحظ أننا في هذه الحالة قمنا باستخدام الخاصية buf لتحويلها إلى سلسلة محارف لأن العنصر النائب s يتوقع منك مصفوفة محارف وليس كائن من نمط String. إذاً قمنا باستخدامه لكي نمرر سلسلة المحارف التي داخل النص. حيث أن هذا الصنف يحتوي على المتغير `صوان` (buf) الذي يمثل مؤشراً على مصفوفة المحارف التي يستخدمها `نـص`.

- يمكنك إدخال سلسلة نصية من المستخدم من خلال إنشاء مصفوفة محارف واستخدام الدالة `أدخل_محارف` (getString) الموجودة ضمن الوحدة `طـرفية` (Console).

مثال:
برنامج أسس لعرض سلسلة نصية تم إدخالها بواسطة المستخدم.

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف نص: نـص؛
عرف ن: مصفوفة[مـحرف، 100]؛ // مصفوفة محارف بحجم محدد لغرض الإدخال
طـرفية.اطبع("أدخل نصًا: ")؛
طـرفية.أدخل_محارف(ن~مؤشر، 100)؛ // نمرر مؤشرًا على المصفوفة مع حجمها
نص = ن؛ // الآن نسخت المحارف من المصفوفة إلى النص
طـرفية.اطبع(نـص("أدخلت: ") + نص + نـص("\ج"))؛
/*
أدخل نصًا: السلام عليكم!
أدخلت: السلام عليكم!
*/
import "Srl/Console.alusus"
import "Srl/String.alusus";
use Srl;
def str: String; // تعريف سلسلة نصية
def s: array[Char, 100]; // مصفوفة محارف بحجم محدد لغرض الإدخال
Console.print("Enter a string: ");
Console.getString(s~ptr, 100); // نمرر مؤشرًا على المصفوفة مع حجمها
str=s~ptr; // الآن نسخت المحارف من المصفوفة إلى النص
Console.print(String("You entered: ") + str + String("\n"));
/*
Enter a string: Hello World!
You entered: Hello World!
*/

دمج السلاسل


يقصد بها إضافة نص إلى آخر، أي وضع سلسلة من النصوص بجانب بعضها. مثال:

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف الاسم_الأول: نـص = "علي"؛
عرف الاسم_الثاني: نـص = "أحمد"؛
عرف الاسم_الكامل: نـص؛
الاسم_الكامل = الاسم_الأول + " " + الاسم_الثاني؛
طـرفية.اطبع(نـص("الاسم الكامل: ") + الاسم_الكامل)؛ // الاسم الكامل: علي أحمد
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def firstName: String = "Ali";
def lastName: String = "Ahmad";
def fullName: String;
fullName = firstName + " " + lastName;
Console.print(String("fullName: ") + fullName); // fullName: Ali Ahmad

تخزين السلاسل والوصول إليها


يتم تخزين السلسلة النصية في الذاكرة حرفاً حرفاً و بالترتيب. وعند تعريف متغير من الصنف `نـص` فإنه يتم حجز مساحة ذاكرية مبدئية للمتغير، ويتم زيادة هذه المساحة في حال دعت الحاجة لذلك تلقائياً. لاحظ المثال التالي:

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف نص = نـص = "لغة "؛ // هنا يتم حجز مساحة ذاكرة للنص
نص += "الأسس"؛ // هنا سيتم زيادة حجم المساحة الذاكرة حسب الحاجة
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def str: String = "Language "; // هنا يتم حجز مساحة ذاكرية للنص
str += "Alusus" // هنا سيتم زيادة حجم المساحة الذاكرية حسب الحاجة

عدد محارف النص تمثل طول السلسلة النصية ويمكننا معرفة طول أي سلسلة نصية من خلال الدالة `هات_الطول` (getLength). وكذلك يمكن الوصول إلى أي محرف من السلسلة النصية من خلال وضع رقم الفهرس (index) بين قوسين هلاليين ().

مثال:

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف الاسم_الأول: نـص = "Ali"؛
عرف الاسم_الثاني: نـص = "Ahmed"؛
عرف الاسم_الكامل: نـص؛
الاسم_الكامل = الاسم_الأول + " " + الاسم_الثاني؛
طـرفية.اطبع(نـص("الاسم الكامل: ") + الاسم_الكامل)؛ // الاسم الكامل: Ali Ahmed
طـرفية.اطبع(نـص("الطول: ") + الاسم_الكامل.هات_الطول() + نـص("\ج"))؛ // الطول: 15
طـرفية.اطبع(نـص("محرف: ") + الاسم_الكامل(5))؛ // محرف: h
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def firstName: String = "Ali";
def lastName: String = "Ahmad";
def fullName: String;
fullName = firstName+ " " + lastName
Console.print(String("fullName: ") + fullName+String("\n")) // fullName: Ali Ahmad
Console.print(String("Length: ") + fullName.getLength()+String("\n")) // Length: 9
Console.print(String("Character: ") + fullName(5)) // Character: h

- يتم تخزين الأحرف الإنجليزية ب 1 بايت من الذاكرة لكل حرف، أما الأحرف الأخرى مثل العربية، فتحتاج إلى 2 بايت لكل حرف. فعلى سبيل المثال، سلسلة المحارف "اب" طولها 4 بايت وليس 2، بينما سلسلة "ab" طولها 2.

ملاحظة: الترميز المستخدم في سلاسل المحارف هو UTF-8، واختلاف عدد البايتات في المحارف ما بين العربية والانجليزية عائد لترميز UTF-8 وليس خاصاً بالأسس.

مقارنة السلاسل


يمكننا استخدام المؤثرات == , =! , > , < , => , =< للمقارنة بين السلاسل النصية.
مثال:

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف نص1: نـص = "Alusus"؛
عرف نص2: نـص = "Language"؛
// النصين متطابقين.
إذا نص1 == نص2 طـرفية.اطبع("نص1 == نص1\ج")؛
// النصين غير متطابقين.
إذا نص1 != نص2 طـرفية.اطبع("نص1 != نص2\ج")؛
// النص الأول يلي النص الثاني في التسلسل الأبجدي.
إذا نص1 > نص2 طـرفية.اطبع("نص1 > نص2\ج")؛
إذا نص1 >= نص2 طـرفية.اطبع("نص1 >= نص2\ج")؛
إذا نص1 < نص2 طـرفية.اطبع("نص1 < نص2\ج")؛
إذا نص1 < نص2 طـرفية.اطبع("نص1 < نص2\ج")؛
/*
نص1 != نص2
نص1 < نص2
نص1 <= نص2
*/
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def str1: String="Alusus";
def str2: String="Language";
// النصين متطابقين.
if (str1 == str2) Console.print("str1 == str2\n");
// النصين غير متطابقين.
if (str1 != str2) Console.print("str1 != str2\n");
// النص الأول يلي النص الثاني في التسلسل الأبجدي.
if (str1 > str2) Console.print("str1 > str2\n");
if (str1 >= str2) Console.print("str1 >= str2\n");
if (str1 < str2) Console.print("str1 < str2\n");
if (str1 <= str2) Console.print("str1 <= str2\n");
/*
str1 != str2
str1 < str2
str1 <= str2
*/

ملاحظات:
- الكائن في حالة ال `نـص` (String) يحتوي في داخله مؤشراً لمصفوفة المحارف `مؤشر[مصفوفة[مـحرف]]` (ptr[array[Char]]) وهذه المصفوفة هي التي يتغير حجمها عند إضافة محتوى.

- مترجم الأسس يحول ال `نـص` (String) إلى مصفوفة محارف عندما يعلم أن المطلوب هو مصفوفة محارف أي عند الحاجة إلى ذلك، باستثناء الدوال المرنة.
على سبيل المثال في حالة دالة الطباعة كل المعطيات التي بعد المعطى الأول غير محددة الصنف (لأنها دالة مرنة أي variadic function) وهذا النوع من الدالات يقبل أي متغير مهما كان صنفه.
في هذه الحالة المترجم لا يعرف أن المطلوب مصفوفة محارف لأن القرار يُتخذ داخل الدالة نفسها التي تقرأ المعطى الأول وعلى أساسه تحدد أنواع المعطيات التي يجب أن تليه. ولذلك، المترجم يُمرر ال `نـص` كما هو دون أن يحولها إلى مصفوفة محارف وهذا لن يعمل لأن دالة print لا تعلم شيئاً عن صنف `نـص` الذي هو صنف داخلي في الأسس، وبالتالي إذا مررت `نـص` فستحتاج لكتابة `.صوان` (buf.) كي تمرر سلسلة المحارف التي داخل النص.

دوال الصنف `نـص`


فيما يلي سنعطي أمثلة عن أهم الدوال المستخدمة مع هذا الصنف. ويمكنك الاطلاع على كل الدوال المعرفة في الأسس من هنا.

- نستخدم الدالة `جد` (find) لتنفيذ عمليات البحث التالية ضمن السلاسل النصية:

  1. بحث عن سلسلة محارف داخل هذا النص. ترجع موقع بداية سلسلة المحارف المكتشفة، أو -1 إذا فشل العثورة عليها.
  2. بحث عن محرف داخل هذا النص. ترجع موقع المحرف المكتشف، أو -1 إذا فشل العثور عليه.

مثال:

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف نص: نـص = "لغة الأسس تتعامل مع الذاكرة بشكل سليم."؛
// هنا سنقوم بطباعة أول فهرس (خانة) يوجد به المحرف . ضمن السلسلة النصية
طـرفية.اطبع("%d\ج"، نص.جد('.'))؛
// هنا طبعنا رقم أول خانة يوجد بها أول محرف من السلسلة "الأسس" ضمن نص
طـرفية.اطبع("%d\ج"، نص.جد("الأسس"))؛ // 7
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def str: String = "Alusus language properly deals with memory";
// str ضمن السلسلة النصية u هنا سنقوم بطباعة أول فهرس (خانة) يوجد به المحرف
Console.print("%d\n", str.find('u')); // 2
// str ضمن السلسلة language هنا طبعنا رقم أول خانة يوجد بها أول محرف من السلسلة
Console.print("%d\n", str.find("language")); // 7

- نستخدم الدالة `جد_آخر` (findLast) بشكل مشابه للدالة السابقة لكن عملية البحث تبدأ من نهاية السلسلة.
مثال:

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف نص: نـص = "Alusus language is based on the C language"؛
عرف حرف: مـحرف = 's'؛
// جد أول تواجد للحرف 's'
إذا نص.جد(حرف) != -1 {
  طـرفية.اطبع("أول تواجد عند %d\ج"، نص.جد(حرف))؛
  // أول تواجد عند 3
}
// جد آخر تواجد للحرف 's'
إذا نص.جد_آخر(حرف) != -1 {
  طـرفية.اطبع("آخر تواجد عند %d\ج"، نص.جد_آخر(حرف))؛
  // آخر تواجد عند 21
}
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def str: String="Alusus language is based on the C language";
def keyword: char = 's';
// Find first occurrence of 's'
if (str.find(keyword) != -1) {
  Console.print("First occurrence is %d\n",str.find(keyword));
  // First occurrence is 3
}
// Find the last occurrence of 's'
if (str.findLast(keyword) != -1) {
  Console.print("Last occurrence is %d\n",str.findLast(keyword));
  // Last occurrence is 21
}

- يمكنك استخدام الدالة `ألحق` (append) لتنفيذ العمليات التالية:

  1. إضافة نص إلى السلسة.
  2. إضافة عدد محدد من المحارف إلى السلسلة.
  3. إضافة محرف إلى نهاية السلسلة.
  4. إضافة عدد صحيح أو عائم إلى السلسة.

وفي كل الحالات يتم التعديل مباشرةً على السلسة المستدعية لهذه الدالة.

مثال:

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف نص1: نـص = "لغة الأسس متوافقة مع "؛
عرف نص2: نـص = "لغة السي."؛
نص1.ألحق(نص2)؛ // إضافة السلسلة الثانية إلى الأولى
طـرفية.اطبع(نـص("إضافة نص2 إلى نص1: ") + نص1)؛

/*
إضافة نص2 إلى نص1: لغة الأسس متوافقة مع لغة السي.
*/
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def str1: String = "Alusus language is compatible with ";
def str2: String = "the C language.";
str1.append(str2); // إضافة السلسلة الثانية إلى الأولى
Console.print(String("Adding str2 to str1: ") + str1);

/*
Adding str2 to str1: Alusus language is compatible with the C language.
*/

ملاحظة: يمكن أيضا الاستعاضة عن هذه الدالة بالمؤثر +=.

- يمكنك استخدام الدالة `سلسل` (concat) بشكل مشابه للدالة `ألحق` (append) مع اختلاف بسيط وهو أن هذه الدالة ترجع النتيجة في نص جديد بدل تعديل النص الحالي.

مثال:

  اشمل "مـتم/طـرفية"؛
  اشمل "مـتم/نـص"؛
  استخدم نـص؛
  عرف نص1: نـص = "لغة الأسس متوافقة مع "؛
  عرف نص2: نـص = "لغة السي"؛
  عرف نص: نـص؛
  نص = نص1.سلسل(نص2)؛ // إضافة السلسلة الثانية إلى الأولى
  طـرفية.اطبع(نـص("إضافة نص2 إلى نص1 وخزن النتيجة في نص: ") + نص)؛
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def str1: String = "Alusus language is based on ";
def str2: String = "the C language.";
def str: String;
str = str1.concat(str2); // إضافة السلسلة الثانية إلى الأولى
Console.print(String("Adding str2 to str1 and storing the result in str: ") + str);

ملاحظة: يمكنك الاستعاضة عن هذه الدالة بالمؤثر +.

- يمكنك استخدام الدالة `قارن` (compare) لتنفيذ عمليات المقارنة بين السلاسل (حسب التسلسل الأبجدي):

  • تقارن هذه الدالة النص الذي قام باستدعائها مع النص الذي نمرره لها.
  • ترجع 0 في حال كان النصان متطابقين.
  • ترجع قيمة موجبة في حال كان النص الذي قام باستدعائها أكبر.
  • ترجع قيمة سالبة في حال كان النص الذي قام باستدعائها أصغر.

مثال:

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف نص1: نـص = "Alusus language is compatible with "؛
عرف نص2: نـص = "the C language."؛
طـرفية.اطبع("%d\ج"، نص1.قارن(نص2))؛
طـرفية.اطبع("%d\ج"، نص1.قارن(نص1))؛
طـرفية.اطبع("%d\ج"، نص2.قارن(نص1))؛
/*
-51
0
51
*/
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def str1: String = "Alusus language is compatible with ";
def str2: String = "the C language.";
Console.print("%d\n", str1.compare(str2));
Console.print("%d\n", str1.compare(str1));
Console.print("%d\n", str2.compare(str1));
/*
-51
0
51
*/

- يمكنك استخدام الدالة `استبدل` (replace) لتعديل جزء محدد من النص (Substring) الذي قام باستدعائها (التعديلات لاتتم على نفس السلسلة وإنما على نسخة منها). حيث نمرر لها الجزء المراد حذفه و النص الذي سيتم إضافته مكان الجزئية التي سيتم حذفها.

مثال:
سنقوم باستبدال كلمة لغة (language) بالرمز * فيما يلي.

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف نص1: نـص = "لغة الأسس متوافقة مع لغة السي"؛
عرف نص2: نـص؛
نص2 = نص1.استبدل("لغة"، "*")؛
طـرفية.اطبع(نص2)؛
/*
* الأسس متوافقة مع * السي
*/
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def str1: String = "Alusus language is compatible with the C language.";
def str2 : String;
str2=str1.replace("language","*");
Console.print(str2)
/*
Alusus * is compatible with the C *.
*/

- يمكنك تغيير حالة الأحرف من صغير إلى كبير والعكس، من خلال الدالتين `صغر` (toLowerCase) و `كبر` (toUpperCase) (التعديل يتم على نسخة من المتغير):

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف نص: نـص = "Alusus language is compatible with the C language.\n"؛
نص = نص.كبر()؛
طـرفية.اطبع(نص)؛
نص = نص.صغر()؛
طـرفية.اطبع(نص)؛
/*
ALUSUS LANGUAGE IS COMPATIBLE WITH THE C LANGUAGE.
alusus language is compatible with the c language.
*/
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def str: String = "Alusus language is compatible with the C language.\n";
str = str.toUpperCase();
Console.print(str);
str = str.toLowerCase();
Console.print(str);
/*
ALUSUS LANGUAGE IS COMPATIBLE WITH THE C LANGUAGE.
alusus language is compatible with the c language.
*/

- يمكنك استخدام الدالة `قطع` (split) لتقسيم السلسلة النصية إلى عدة أقسام بناءاً على محرف محدد (أو سلسلة نصية محددة)، وتعيد هذه الدالة مصفوفة عناصرها سلاسل نصية.
مثال:

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
اشمل "مـتم/مـصفوفة"؛
استخدم مـتم؛
عرف نص: نـص = "لغة الأسس متوافقة مع لغة السي."؛
عرف م: مـصفوفة[نـص]؛
م = نص.قطع(" ")؛ // تقسيط النص إلى كلمات وتخزينه في مصفوفة من السلاسل
عرف ع: صحيح؛
لكل ع = 0، ع < م.هات_الطول()، ++ع {
  طـرفية.اطبع("قيمة العنصر %d هي: %s\ج"، ع، م(ع).صوان)؛
}
/*
قيمة العنصر 0 هي: لغة
قيمة العنصر 0 هي: الأسس
قيمة العنصر 0 هي: متوافقة
قيمة العنصر 0 هي: مع
قيمة العنصر 0 هي: لغة
قيمة العنصر 0 هي: السي.
*/
import "Srl/Console";
import "Srl/String";
import "Srl/Array";
use Srl;
def str: String = "Alusus language is compatible with the C language.";
def arr: Array[String];
arr = str.split(" "); // تقسيم النص إلى كلمات وتخزينه في مصفوفة من السلاسل
def index: Int;
for index = 0, index < arr.getLength(), index++ {
  Console.print("The value of element %d is: %s\n", index, arr(index).buf);
}
/*
The value of element 0 is: Alusus
The value of element 1 is: language
The value of element 2 is: is
The value of element 3 is: compatible
The value of element 4 is: with
The value of element 5 is: the
The value of element 6 is: C
The value of element 7 is: language.
*/

- يمكنك استخدام الدالة `اجتزئ` (slice) لنسخ (أو قص) جزء من سلسلة النصية وتخزينه في متغير جديد دون التعديل على السلسلة الأصلية، حيث ترجع نص عبارة عن جزء من النص (Substring) الذي قام باستدعائها. نمرر لهذه الدالة فهرس (index) المحرف الذي نريد البدء بنسخ النص من عنده و عدد الأحرف التي تريد أن تقوم بنسخها.

مثال:

اشمل "مـتم/طـرفية"؛
اشمل "مـتم/نـص"؛
استخدم مـتم؛
عرف نص: نـص = "Alusus language is compatible with the C language."؛
عرف جزء: نـص؛
جزء = نص.اجتزئ(7، 8)؛
طـرفية.اطبع(جزء)؛
/*
language
*/
import "Srl/Console.alusus";
import "Srl/String.alusus";
use Srl;
def str: String="Alusus language is compatible with the C language.";
def substring: String;
substring = str.slice(7, 8);
Console.print(substring);
/*
language
*/

الصنف `مؤشر[مصفوفة[مـحرف]]` (ptr[array[Char]])


يمكننا استخدام الصنف `مؤشر[مصفوفة[مـحرف]]` (ptr[array[Char]]) (مؤشر على مصفوفة) لتعريف وتخزين سلسلة نصية، وللوصول إلى محارف هذه السلسلة سنستخدم المؤثر `~محتوى` (cnt~)، لأن المتغير مؤشر ونحن بحاجة إلى الوصول إلى المحتوى الذي يشير إليه، وهذا مايفعله المؤثر السابق.

المثال الأول:

اشمل "مـتم/طـرفية"؛
استخدم مـتم.طـرفية؛
عرف ن: مؤشر[مصفوفة[مـحرف]] = "Alusus"؛ // تعريف سلسلة نصية
اطبع("اللغة: %s\ج"، ن)؛ // طباعتها
اطبع("أول محرف: %c\ج"، ن~محتوى(0))؛ // الوصول للعنصر الأول وطباعته
اطبع("ثاني محرف: %c\ج"، ن~محتوى(1))؛ // الثاني
اطبع("ترميز المحرف A: %d"، ن~محتوى(0))؛ // طباعة ترميز المحرف الأول حسب جدول الأسكي
/*
اللغة: Alusus
أول محرف: A
ثاني محرف: l
ترميز المحرف A: 65
*/
import "Srl/Console.alusus"
use Srl.Console;
def s: ptr[array[Char]] = "Alusus"; // تعريف سلسلة نصية
print("Lannguage: %s\n", s); // طباعتها
print("First character: %c\n", s~cnt(0)); // الوصول للعنصر الأول وطباعته
print("Second one: %c\n", s~cnt(1)); // الثاني
print("ASCII of A: %d",s~cnt(0)); // طباعة قيمة المحرف الأول حسب جدول الآسكي
/*
Lannguage: Alusus
First character: A
Second one: l
ASCII of A: 65
*/

المثال الثاني:
برنامج أسس لعرض سلسلة نصية تم إدخالها بواسطة المستخدم.

اشمل "مـتم/طـرفية"؛
استخدم مـتم.طـرفية؛
عرف م: مؤشر[مصفوفة[مـحرف]]؛
عرف مدخل: مصفوفة[مـحرف، 100]؛ // تعريف مصفوفة محارف بحجم محدد لغرض الإدخال
اطبع("أدخل سلسلة نصية: ")؛
أدخل_محارف(مدخل~مؤشر، 100)؛
م = مدخل~مؤشر؛
اطبع("أدخلت: %s\ج"، م)؛ // طباعتها
/*
أدخل سلسلة نصية: لغة الأسس
أدخلت: لغة الأسس
*/
import "Srl/Console.alusus"
use Srl.Console;
def s: ptr[array[Char]];
def input: array[Char, 100]; // تعريف مصفوفة محارف بحجم محدد لغرض الإدخال
print("Enter a string: ");
getString(input~ptr, 100);
s = input~ptr;
print("You entered : %s\n",s) // طباعتها
/*
Enter a string: Alusus Language
You entered : Alusus Language
*/

- بشكل عام، فإن استخدام الصنف `نـص` (String) أكثر سهولة ومرونة وأمان، كما أنه يمتلك العديد من الدوال المساعدة ويغنيك عن استخدام الصنف `مؤشر[مصفوفة[مـحرف]]` لذا من الأفضل استخدامه، لكن أحياناً قد تحتاج للتعامل مع مكتبات ودالات السي، وبذلك تحتاج للتعامل مع هذا الصنف (وهو متوافق مع الصنف *char في السي).

- الصنف `مؤشر[مصفوفة[محرف]]` متوافق مع الصنف *char في السي كما ذكرنا، وبالتالي مفيد للتعامل مع مكتبات ودالات النظام.

- عند التعامل مع هذا الصنف يكون من الصعب استخدام النصوص بشكل ديناميكي لأننا سنحتاج لحجز الذاكرة وتفريغها يدوياً أما في الصنف `نـص` فهذه العمليات تتم بسهولة وبشكل تلقائي.

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

لاحظ في المثال السابق أننا قمنا بتعريف متغير `م` (s) من الصنف `مؤشر[مصفوفة[مـحرف]]` وقمنا بعد ذلك بتعريف مصفوفة محارف `مدخل` (input) بطول 100 من أجل عملية الإدخال، وبالتالي لايمكن أن يتجاوز طول النص المدخل 100 محرف.