البرمجة

حساب طول مصفوفة unsigned char * بدون NULL في لغة البرمجة C

في البرمجة بلغة C، يُعتبر العمل مع مصفوفات الأحرف (strings) من بين التحديات التي يمكن مواجهتها، خاصةً عند التعامل مع مصفوفات من نوع unsigned char * أو signed char * التي لا تنتهي بحرف NULL. تعتمد الكثير من وظائف معالجة السلاسل في C على وجود حرف NULL لتحديد نهاية المصفوفة، ومن بين هذه الوظائف توجد strlen التي تقوم بحساب طول المصفوفة.

في المصدر الذي قدمته، يظهر أنه غير ممكن الاعتماد على strlen لحساب طول unsigned char * إذا لم تكن المصفوفة تنتهي بحرف NULL. هذا يترك السائل في حيرة بشأن كيفية حساب طول المصفوفة في مثل هذه الحالة.

يُظهر الكود الذي رأيته محاولة لاستخدام sizeof(unsigned char *) للحصول على طول المصفوفة. ومع ذلك، يجب أن نفهم أن sizeof(unsigned char *) لا يُعيد حجم المصفوفة نفسها، بل يُعيد حجم المؤشر إلى المصفوفة، وهو عادة حجم كلمة الذاكرة على النظام.

للحصول على طول المصفوفة بشكل دقيق، يتعين عليك تتبع البيانات بنفسك. يمكنك استخدام حلقة تكرار للانتقال عبر المصفوفة وزيادة متغير يتعدى العدد الإجمالي للعناصر. على سبيل المثال:

c
size_t getArrayLength(const unsigned char *array) { size_t length = 0; // تكرار عبر المصفوفة حتى نصل إلى نهايتها while (array[length] != '\0') { length++; } return length; }

يقوم الكود أعلاه بتحديد طول المصفوفة باستخدام حلقة تكرار تتحرك عبر العناصر حتى تصل إلى الحرف NULL. يمكنك استخدام هذه الوظيفة للحصول على طول المصفوفة حتى إذا لم تنتهي بحرف NULL.

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

المزيد من المعلومات

في عالم البرمجة بلغة C، يعتبر التعامل مع المصفوفات من دون نهاية NULL تحدًا إضافيًا. يتميز نظام اللغة C بحرفيته وقربه من عتاد الحاسوب، ولكن في بعض الحالات، يكون من الضروري التفكير في الحلول الإبداعية للتعامل مع تحديات مثل حساب طول المصفوفة.

عندما تكون المصفوفة من نوع unsigned char *، يعني ذلك أن كل عنصر في المصفوفة يحتوي على قيمة بين 0 و255 (بدون علامة). وبما أننا نعلم أن القيمة 0 تُستخدم كحرف NULL، يمكننا الاستفادة من ذلك في حساب طول المصفوفة.

في المثال السابق، استخدمت وظيفة getArrayLength للتحقق من القيم في المصفوفة حتى الوصول إلى القيمة 0. ومع ذلك، يمكن تحسين هذا النهج بشكل طبيعي باستخدام مفهوم المؤشرات.

إليك نسخة محسنة قليلاً للكود:

c
#include size_t getArrayLength(const unsigned char *array) { const unsigned char *current = array; // تحرك عبر المصفوفة باستخدام المؤشر حتى نصل إلى الحرف NULL while (*current != '\0') { current++; } // حساب الطول باستخدام الفارق بين المؤشر الحالي وبداية المصفوفة return current - array; } int main() { // مثال على كيفية استخدام الوظيفة unsigned char myArray[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; size_t length = getArrayLength(myArray); printf("Length of the array: %zu\n", length); return 0; }

هذا الكود يستخدم المؤشر current لتحريك نفسه عبر المصفوفة حتى يصل إلى الحرف NULL، ثم يحسب الطول ببساطة باستخدام الفارق بين المؤشر current وبداية المصفوفة.

زر الذهاب إلى الأعلى