البرمجة

تجنب استخدام دالة gets في C

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

لفهم هذه المشكلة، يجب أن نلقي نظرة على كيفية عمل الدالة gets() وكيفية التعامل مع المصفوفات في لغة C.

في البداية، يجب التنبيه إلى أن استخدام دالة gets() في البرنامج قد أدى إلى مشكلة أمنية. تستخدم دالة gets() لقراءة سلسلة من المحرفين من المدخل القياسي (stdin) حتى تصل إلى نهاية السلسلة أو تتلقى محرف newline (\n). ومع ذلك، فإنها لا تتحقق من حجم المدخل، مما يجعلها عرضة لمشكلة تسرب المخزن (buffer overflow) والتي يمكن أن تؤدي إلى ثغرات أمنية خطيرة. بدلاً من ذلك، يفضل استخدام دالة fgets() التي تأخذ حجم النص كمدخل.

على أي حال، السبب وراء ظهور القيم غير المرغوب فيها (مثل الرموز الابتسامات) هو أنك لم تقم بتهيئة المصفوفة keyword بقيم مبدئية، لذا تحتوي على ما يعرف بالقيم العشوائية. وعندما تقوم بتجاوز حدود هذه المصفوفة بمحتوى السلسلة المقروءة بواسطة gets()، فإن القيم العشوائية تظهر كأجزاء من السلسلة.

لحل هذه المشكلة، يجب أولاً تهيئة المصفوفة keyword بقيم مبدئية بحيث تكون جميع العناصر مساوية لقيم النهاية (\0)، ثم تقوم بتحميل الأحرف الفريدة في المصفوفة keyword.

اليك الكود بعد إجراء التعديلات:

c
#include int main() { char key[10], keyword[10]; int i, j, k, flag; printf("Enter a string: "); fgets(key, sizeof(key), stdin); i = 0; j = 0; flag = 1; // Initialize keyword array with null terminators for (i = 0; i < 10; i++) { keyword[i] = '\0'; } i = 0; while (key[i] != '\0' && key[i] != '\n') { k = 0; while (keyword[k] != '\0') { if (key[i] == keyword[k]) { flag = 0; break; } k++; } if (flag == 1) { keyword[j] = key[i]; j++; } flag = 1; i++; } printf("Unique characters: %s\n", keyword); return 0; }

قمت بتغيير gets() إلى fgets() للحصول على مدخل آمن. وقمت بتهيئة المصفوفة keyword بقيم مبدئية باستخدام حلقة for، ثم قمت بإجراء العمليات الباقية كما هي. هذا يجب أن يحل المشكلة التي واجهتها في البرنامج الأصلي.

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

بالطبع، دعني أكمل المقال لشرح بعض النقاط الأساسية المتعلقة بالتعديلات التي تم إجراؤها في الكود.


بدايةً، يجب التأكيد على أهمية تجنب استخدام دالة gets() في لغة C، حيث إنها تشكل خطرًا على أمن البرنامج بسبب عدم التحقق من حجم المدخل. بدلاً من ذلك، يُفضل استخدام دالة fgets() التي تأخذ حجم المدخل كوسيلة لتفادي مشكلات تسرب المخزن (buffer overflow) وحماية البرنامج من الهجمات الضارة.

ثانيًا، لحل مشكلة ظهور القيم غير المرغوب فيها في المصفوفة المستهدفة keyword، تم استخدام حلول برمجية تضمن تهيئة المصفوفة بقيم مبدئية. تم تعيين كل عنصر في المصفوفة keyword بقيمة النهاية (\0) باستخدام حلقة for قبل بدء العملية الرئيسية لنسخ الأحرف الفريدة.

ثالثًا، قمت بتعديل التعليمة الشرطية في الحلقة الرئيسية للبرنامج لتضمن تحديد نهاية السلسلة المقروءة من المدخل. بمعنى آخر، تمت إضافة شرط للتحقق مما إذا كان المحرف الحالي في المصفوفة key هو نهاية السلسلة (\n) أو لا.

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


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

مقالات ذات صلة

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

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر