استخدام strcmp()
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 18 من 63.
لقد تعلمت كيفية دمج السلاسل النصية باستخدام strcat()، ولكن ماذا لو كنت بحاجة إلى تحديد ما إذا كانت سلسلتان نصيتان تحتويان على نفس النص تماماً؟ في لغة C، لا يمكنك استخدام عامل التساوي (==) لمقارنة السلاسل النصية لأنه يقارن فقط عناوين الذاكرة، وليس المحتوى الفعلي.
تقوم الدالة strcmp() من مكتبة <string.h> بحل هذه المشكلة عن طريق مقارنة سلسلتين نصيتين حرفاً بحرف. فهي تقوم بما يسمى مقارنة معجمية (lexicographical comparison) - وهي في الأساس مقارنة السلاسل النصية حسب ترتيب القاموس.
#include <stdio.h>
#include <string.h>
char word1[] = "apple";
char word2[] = "apple";
int result = strcmp(word1, word2); // تعيد 0 (السلاسل متساوية)تعيد الدالة strcmp() ثلاثة أنواع مختلفة من القيم: فهي تعيد 0 إذا كانت السلسلتان النصيتان متطابقتين، وقيمة سالبة إذا كانت السلسلة الأولى تسبق الثانية أبجديًا، وقيمة موجبة إذا كانت السلسلة الأولى تأتي بعد الثانية أبجديًا.
هذه الدالة ضرورية لاتخاذ القرارات بناءً على محتوى السلسلة النصية، مثل التحقق من صحة إدخال المستخدم، أو فرز البيانات النصية، أو تنفيذ وظيفة البحث في برامجك.
التحدي
سهلاكتب برنامجاً بلغة C ينفذ نظاماً بسيطاً للتحقق من كلمة المرور باستخدام دالة strcmp(). يجب على برنامجك القيام بما يلي:
- قراءة عدد صحيح
nيمثل عدد محاولات تسجيل الدخول التي سيتم معالجتها - لكل محاولة تسجيل دخول:
- قراءة اسم المستخدم من الإدخال
- قراءة كلمة المرور من الإدخال
- استخدام
strcmp()لمقارنة اسم المستخدم مع "admin" - استخدام
strcmp()لمقارنة كلمة المرور مع "secret123" - طباعة الرسالة المناسبة بناءً على نتائج المقارنة
- بعد معالجة جميع المحاولات، قم بعدّ وعرض عدد عمليات تسجيل الدخول الناجحة التي حدثت
يجب أن يكون منطق التحقق من تسجيل الدخول كما يلي:
- إذا كان كل من اسم المستخدم وكلمة المرور صحيحين: اطبع "Login successful"
- إذا كان اسم المستخدم صحيحاً ولكن كلمة المرور خاطئة: اطبع "Invalid password"
- إذا كان اسم المستخدم خاطئاً ولكن كلمة المرور صحيحة: اطبع "Invalid username"
- إذا كان كل من اسم المستخدم وكلمة المرور خاطئين: اطبع "Invalid credentials"
تذكر تضمين الترويسة <string.h> لاستخدام دالة strcmp().
يجب أن يعرض مخرجك النتائج بالتنسيق التالي:
[Login result message]
[Login result message]
...
Total successful logins: [count]على سبيل المثال، إذا كان الإدخال هو:
4
admin
secret123
user
password
admin
wrong
guest
secret123يجب أن يكون مخرجك:
Login successful
Invalid credentials
Invalid password
Invalid username
Total successful logins: 1يختبر هذا التحدي فهمك لاستخدام strcmp() لمقارنة السلاسل النصية من حيث التساوي، وتنفيذ المنطق الشرطي بناءً على نتائج مقارنة السلاسل، وعدّ التكرارات بناءً على نتائج المقارنة.
ورقة مرجعية
تقوم الدالة strcmp() من المكتبة <string.h> بمقارنة سلسلتين نصيتين حرفاً بحرف باستخدام المقارنة المعجمية (lexicographical comparison):
#include <string.h>
char word1[] = "apple";
char word2[] = "apple";
int result = strcmp(word1, word2);تعيد الدالة strcmp() ما يلي:
0إذا كانت السلاسل متطابقة- قيمة سالبة إذا كانت السلسلة الأولى تسبق الثانية أبجدياً
- قيمة موجبة إذا كانت السلسلة الأولى تأتي بعد الثانية أبجدياً
لا يمكن استخدام == لمقارنة السلاسل النصية في لغة C لأنها تقارن عناوين الذاكرة فقط، وليس المحتوى.
جرّب بنفسك
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
char username[100];
char password[100];
int successful_logins = 0;
// TODO: اكتب كودك هنا
// معالجة كل محاولة تسجيل دخول باستخدام دالة strcmp()
// قارن اسم المستخدم بـ "admin" وكلمة المرور بـ "secret123"
// اطبع الرسائل المناسبة واحسب عدد عمليات تسجيل الدخول الناجحة
printf("Total successful logins: %d\n", successful_logins);
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية