في البداية، يجدر بي أن أشير إلى أن لغة البرمجة C تتميز بسياسة صرامة في تعاملها مع الأنواع المختلفة. عند استخدام دالة scanf
لقراءة الإدخال من المستخدم باستخدام "%d"
، فإنها تتوقع أن تكون القيمة المدخلة هي عدد صحيح.
في الشيفرة التي قدمتها، عندما تقوم بإدخال سلسلة نصية بدلاً من عدد صحيح، يحدث ما يعرف بظاهرة “buffer overflow” حيث يتم قراءة الجزء الأول من السلسلة كرقم صحيح والأجزاء الباقية تظل في الذاكرة، مما يؤدي إلى نتائج غير متوقعة.
-
مشكلات استرجاع البيانات في التطبيقات31/03/2024
-
قراءة وتخزين البيانات من ملف في جافا13/02/2024
-
اختيار Middleware: ASP.NET Core vs OWIN27/03/2024
لتجنب هذا السلوك، يمكنك استخدام دالة fgets
لقراءة السلسلة النصية ثم استخدام دالة sscanf
لتحويل السلسلة إلى عدد صحيح. هذا يسمح لك بالتحكم في الإدخال وتفادي مشكلة تدفق الذاكرة.
فيما يلي مثال على كيفية تعديل الشيفرة:
c#include
int main() {
char input[100]; // تحديد حجم السلسلة النصية المقروءة
printf("Write the age of the swimmer\n");
fgets(input, sizeof(input), stdin); // استخدام fgets لقراءة السلسلة
int age;
if (sscanf(input, "%d", &age) == 1) { // استخدام sscanf لتحويل السلسلة إلى عدد صحيح
if (age < 5)
printf("minimum age is five years old\n");
else if (age >= 5 && age <= 7)
printf("Category: child A\n");
else if (age >= 8 && age <= 11)
printf("Category: child B\n");
else if (age >= 12 && age <= 13)
printf("Category: Juvenile A\n");
else if (age >= 14 && age <= 17)
printf("Category: Juvenile A\n");
else if (age >= 18)
printf("Category: Adult\n");
else
printf("Invalid age\n");
} else {
printf("Write only numbers\n");
}
// system("PAUSE"); // يمكنك تعليق هذا الجزء إذا كنت تستخدم نظاماً آخر غير Windows
return 0;
}
هذا التعديل يجعل البرنامج أكثر مرونة في التعامل مع إدخال المستخدم ويتجنب مشكلة تحويل السلسلة إلى عدد صحيح بطريقة غير صحيحة.
المزيد من المعلومات
بالطبع، دعنا نقوم بتوسيع المحتوى ليكون أكثر غنى بالمعلومات. يبدو أن البرنامج الذي قدمته يقوم بتصنيف السباحين حسب الفئات العمرية، ولكن هناك بعض النقاط التي يمكن تحسينها أو التعميق فيها.
1. التحقق من صحة الإدخال:
يفضل دائمًا التحقق من صحة الإدخال الذي يقوم المستخدم بإدخاله. في الشيفرة الحالية، إذا قام المستخدم بإدخال قيمة غير صحيحة، فإن البرنامج سيقوم بطباعة “Write only numbers” دون توضيح أكثر. يمكنك استخدام دالة strtol
لفحص صحة الإدخال بشكل أفضل.
2. تحسين رسائل الإخطار:
يمكنك تحسين رسائل الإخطار لتكون أكثر وضوحًا وإرشادًا للمستخدم. على سبيل المثال، يمكنك توضيح أكثر حول الفئات العمرية.
3. التفاعل مع المستخدم:
يمكنك زيادة تفاعل البرنامج مع المستخدم، مثل طلب إعادة المحاولة في حالة إدخال غير صحيح أو تقديم نصائح إضافية حول كيفية إدخال البيانات بشكل صحيح.
4. إضافة وحدات زمنية:
قد يكون من المفيد إضافة وحدات زمنية للإخطارات، مثل استخدام دالة sleep
لتأخير الإغلاق في حالة عدم وجود إدخال صحيح.
فيما يلي نموذج مع تحسينات مقترحة:
c#include
#include
int main() {
char input[100];
printf("Write the age of the swimmer\n");
if (fgets(input, sizeof(input), stdin) != NULL) {
// استخدام strtol لفحص صحة الإدخال
char *endptr;
long age = strtol(input, &endptr, 10);
// التحقق من صحة الإدخال
if (*endptr == '\n' || *endptr == '\0') {
if (age < 5)
printf("The minimum age is five years old\n");
else if (age >= 5 && age <= 7)
printf("Category: Child A\n");
else if (age >= 8 && age <= 11)
printf("Category: Child B\n");
else if (age >= 12 && age <= 13)
printf("Category: Juvenile A\n");
else if (age >= 14 && age <= 17)
printf("Category: Juvenile B\n");
else if (age >= 18)
printf("Category: Adult\n");
else
printf("Invalid age\n");
} else {
printf("Invalid input. Please write only numbers\n");
}
} else {
printf("Error reading input\n");
}
// إضافة تأخير قبل الإغلاق
// sleep(2);
return 0;
}
هذا النموذج يعتبر تحسينًا على الشيفرة السابقة، مما يجعل البرنامج أكثر صحة وتفاعلاً مع المستخدم.