البرمجة

مشكلة قراءة الإدخالات في C++

عند النظر إلى الشاشة المرفقة، يتضح أن الكود يواجه مشكلة في قراءة الإدخالات لسلسلة “التصنيف” (designation)، حيث يقوم بتجاوز عملية قراءتها مباشرةً وينتقل إلى الإدخال التالي للراتب (salary) دون أن يسمح للمستخدم بإدخال بيانات التصنيف.

هذه المشكلة تنتج عن الطريقة التي يتعامل بها الكود مع دالة fgets() لقراءة سلسلة النص للتصنيف. يبدو أن المشكلة تنشأ من استخدام دالة cin بعد دالة الإدخال fgets() في الدالة getdata(). عندما يتم استخدام cin للإدخال الرقمي (المعطيات الرقمية)، فإنه يترك newline (سطر فارغ) في الذاكرة، وعند استدعاء fgets() بعد ذلك، فإنها تقرأ هذا newline كمدخل. يتم تصحيح هذا عن طريق إزالة newline المتبقي بعد الدالة cin باستخدام دالة cin.ignore().

ومن أجل حل هذه المشكلة، يمكن إضافة استدعاء لدالة cin.ignore() بعد كل دالة cin في دالة getdata() لتجاوز newline المتبقي:

cpp
void getdata() { cout<<"ENTER NAME:\n"; fgets(name,20,stdin); cout<<"ENTER ID:\n"; cin>>id; cin.ignore(); // تجاوز newline المتبقي cout<<"ENTER DESIGNATION:\n"; fgets(desig,20,stdin); cout<<"ENTER SALARY:\n"; cin>>salary; cin.ignore(); // تجاوز newline المتبقي }

بتطبيق هذه التغييرات، يجب أن يتمكن الكود الآن من قراءة بيانات التصنيف بشكل صحيح وعرضها بدقة كما هو موضح في الشاشة المرفقة.

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

بالرغم من أن الكود يعمل بشكل جيد في بعض بيئات التطوير مثل TurboC3، إلا أنه يواجه مشاكل في بيئات أخرى مبنية على مترجم GCC مثل DevCPP و GCC نفسه في نظام Linux. هذه المشكلة تعود إلى طريقة تعامل مترجم GCC مع الإدخالات النصية و newline المتبقية في الذاكرة بعد استخدام دالة cin.

لحل هذه المشكلة، تم استخدام دالة cin.ignore() بعد استخدام دالة cin في دالة getdata()، وذلك لتجاوز newline المتبقية والتي تعمل على إفساد عملية قراءة الإدخالات النصية باستخدام دالة fgets(). تم توضيح هذا الحل في القسم السابق.

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

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

بهذا، يمكن للمطورين الآن الاستمتاع بتشغيل برامجهم بسلاسة وثقة في مختلف بيئات التطوير التي تستخدم مترجم GCC، وهذا يعكس القدرة على فهم ومعالجة المشاكل التقنية التي قد تواجه المطورين أثناء تطوير واختبار تطبيقاتهم.

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