المُنهي الصفري (Null Terminator)
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 13 من 63.
لقد تعلمت أن السلاسل النصية (strings) في لغة C هي مصفوفات من الأحرف، ولكن هناك تفصيل بالغ الأهمية يجعلها تعمل بشكل صحيح: يجب أن تنتهي كل سلسلة نصية في C بحرف خاص يسمى المُنهي الصفري (null terminator)، ويُكتب كـ \0.
المُنهي الصفري (null terminator) هو حرف بقيمة ASCII تبلغ صفراً يحدد نهاية السلسلة النصية. بدونه، لن تعرف دوال مثل printf أين تنتهي السلسلة النصية الخاصة بك، وستستمر في قراءة الذاكرة حتى تصادف عشوائياً بايتاً صفرياً، مما يؤدي غالباً إلى إنتاج مخرجات غير مفهومة.
char word[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
// تخبر الـ \0 لغة C: "تنتهي السلسلة النصية هنا"عندما تقوم بتهيئة سلسلة نصية باستخدام قيمة حرفية مثل "Hello"، تقوم لغة C تلقائياً بإضافة النهاية الصفرية (null terminator) لك. ولكن عندما تقوم ببناء سلسلة نصية يدوياً حرفاً بحرف، يجب أن تتذكر إضافة \0 في النهاية.
هذا الرمز المنهي الفارغ (null terminator) هو السبب في أن كلمة مكونة من 5 أحرف مثل "Hello" تحتاج إلى مصفوفة أحرف مكونة من 6 عناصر - مساحة إضافية واحدة لـ \0. فهم هذا المفهوم ضروري لأنه يمثل الأساس لكيفية تحديد جميع دوال السلاسل النصية في لغة C لمكان بداية ونهاية السلاسل.
التحدي
سهلاكتب برنامجاً بلغة C يوضح كيفية إنشاء والتعامل مع السلاسل النصية (strings) باستخدام التهيئة اليدوية حرفاً بحرف مع إنهاء السلسلة برمز null بشكل صحيح. يجب أن يقوم برنامجك بما يلي:
- الإعلان عن مصفوفة أحرف باسم
nameتحتوي على 5 عناصر بالضبط - تهيئة مصفوفة
nameيدوياً حرفاً بحرف لتهجئة "John" مع إنهاء السلسلة برمز null بشكل صحيح:- العنصر الأول: 'J'
- العنصر الثاني: 'o'
- العنصر الثالث: 'h'
- العنصر الرابع: 'n'
- العنصر الخامس:
'\0'(null terminator)
- الإعلان عن مصفوفة أحرف ثانية باسم
cityتحتوي على 7 عناصر بالضبط - تهيئة مصفوفة
cityيدوياً حرفاً بحرف لتهجئة "Boston" مع إنهاء السلسلة برمز null بشكل صحيح:- استخدم تعيينات الأحرف الفردية لـ 'B' و 'o' و 's' و 't' و 'o' و 'n' و
'\0'
- استخدم تعيينات الأحرف الفردية لـ 'B' و 'o' و 's' و 't' و 'o' و 'n' و
- طباعة كلتا السلسلتين باستخدام
printfمع محدد التنسيق%s - توضيح ما يحدث بدون إنهاء السلسلة برمز null عن طريق إنشاء مصفوفة أحرف ثالثة باسم
testتحتوي على 4 عناصر - تهيئة
testبالأحرف 'A' و 'B' و 'C' و 'D' فقط (بدون رمز null terminator) - طباعة مصفوفة
testباستخدام%sلإظهار مخرجات غير متوقعة
يجب أن تعرض مخرجاتك النتائج بالتنسيق التالي:
Name: John
City: Boston
Test without null terminator: ABCD[unpredictable characters]يختبر هذا التحدي فهمك لبناء السلاسل النصية يدوياً، والأهمية البالغة لرمز null terminator '\0' في سلاسل C النصية، وكيف تعتمد printf مع %s على إيجاد رمز null لمعرفة مكان انتهاء السلسلة.
ورقة مرجعية
سلاسل C النصية هي مصفوفات أحرف يجب أن تنتهي بـ منتهي صفري (null terminator) \0 لتمييز نهاية السلسلة.
قيمة ASCII للمنهي الصفري هي صفر ويخبر الدوال مثل printf بمكان انتهاء السلسلة النصية:
char word[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
// تخبر \0 لغة C: "تنتهي السلسلة النصية هنا"عند استخدام الثوابت النصية مثل "Hello"، تضيف لغة C المنهي الصفري تلقائيًا. وعند بناء السلاسل النصية حرفًا بحرف، يجب عليك إضافة \0 يدويًا.
تحتاج السلسلة النصية إلى عنصر مصفوفة إضافي واحد للمنهي الصفري - "Hello" (5 أحرف) تتطلب مصفوفة مكونة من 6 عناصر.
جرّب بنفسك
#include <stdio.h>
int main() {
// TODO: اكتب كودك هنا
// قم بتعريف وتهيئة مصفوفات الأحرف كما هو محدد
// اطبع النتائج
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية