البرمجة

تحسين استخدام fgets في برامج المصادقة بلغة البرمجة C

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

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

لذا، في حالتك، يمكنك تعديل الدالة login على النحو التالي:

c
#include #include int login(char *user, char *passwd){ int enter = 0; char p[7]; // زيادة حجم المصفوفة للتعامل مع المحرف الجديد '\n' char u[7]; printf("User: "); fgets(u, sizeof u, stdin); u[strcspn(u, "\n")] = '\0'; // لإزالة المحرف الجديد '\n' printf("Pass: "); fgets(p, sizeof p, stdin); p[strcspn(p, "\n")] = '\0'; // لإزالة المحرف الجديد '\n' if (strcmp(user, u) == 0 && strcmp(passwd, p) == 0){ enter = 1; } return enter; // تصحيح اسم المتغير } int main(){ char user[] = "admin"; char passwd[] = "12345"; if (login(user, passwd)){ puts("--ACCESS GRANTED--"); } else{ puts("--Wrong pass or user--"); } return 0; }

التغييرات تشمل زيادة حجم المصفوفة لتضمن استيعاب المحرف الجديد \n، واستخدام strcspn لإزالة هذا المحرف بعد استخدام fgets().

الناتج النهائي يجب أن يسمح لك بإدخال اسم المستخدم وكلمة المرور بشكل صحيح ويظهر “ACCESS GRANTED” إذا كانت صحيحة، وإلا يظهر “Wrong pass or user”.

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

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

أولًا، يتم استخدام fgets() للحصول على سلسلة من الحروف من المستخدم، ولكن هنا تكمن المشكلة. عندما يقوم المستخدم بإدخال اسم المستخدم “admin”، فإن السلسلة التي يتم قراءتها تتضمن الحروف وأيضًا السطور الجديدة “\n”. ثم يأتي السطر “Pass: “، وعند استخدام fgets() مرة أخرى للحصول على كلمة المرور، يقرأ البرنامج سطرًا فارغًا ناتجًا عن الضغط على “Enter” الذي أدخله المستخدم.

لتجنب هذه المشكلة، يمكنك إزالة السطور الجديدة المتضمنة في السلسلة المقروءة باستخدام strcspn()، وهي وظيفة تعيد طول الجزء الذي لا تتواجد فيه الحروف المحددة. فيما يلي كيفية تعديل الشيفرة:

c
#include #include int login(char *user, char *passwd){ int enter = 0; char p[50]; // زيادة حجم المصفوفة لتلبية الحالات المختلفة char u[50]; printf("User: "); fgets(u, sizeof u, stdin); u[strcspn(u, "\n")] = '\0'; // إزالة السطور الجديدة printf("Pass: "); fgets(p, sizeof p, stdin); p[strcspn(p, "\n")] = '\0'; // إزالة السطور الجديدة if (strcmp(user, u) == 0 && strcmp(passwd, p) == 0){ enter = 1; } return enter; } int main(){ char user[] = "admin"; char passwd[] = "12345"; if (login(user, passwd)){ puts("--ACCESS GRANTED--"); } else{ puts("--Wrong pass or user--"); } return 0; }

باستخدام هذه التعديلات، يتم إزالة السطور الجديدة من نهاية السلاسل المقروءة، مما يسمح للبرنامج بالعمل بشكل صحيح ويسمح للمستخدم بإدخال كلمة المرور بشكل صحيح.

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