البرمجة

قراءة السلاسل في C: مشكلة تجاوز الحدود

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

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

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

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

بالتأكيد، دعني أضيف المزيد من المعلومات لتوضيح هذا الأمر بشكل أكبر.

عندما تقوم بتعريف مصفوفة في C، مثل المصفوفة char str[10]; في الكود الذي قدمته، فإنك تحدد حجم المصفوفة لتكون 10 عناصر. ولكن عند استخدام scanf() لقراءة سلسلة نصية إلى هذه المصفوفة، فإن scanf() لا تعرف حجم المصفوفة المحددة، فهي تعتمد على علامة النقطة %s لتحديد متى تتوقف عملية القراءة.

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

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

لتجنب هذه المشكلة، يفضل استخدام دوال آمنة لقراءة السلاسل النصية مثل fgets() بدلاً من scanf()، حيث يمكنك تحديد الحد الأقصى للقراءة وبالتالي تجنب تجاوز الحدود المحددة للمصفوفة.

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