كيفية مقارنة السلاسل النصية في لغة C باستخدام strcmp وstrncmp مع أمثلة عملية

1. المقدمة

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

2. الدوال المستخدمة في مقارنة السلاسل النصية

2.1 دالة strcmp()

تُستخدم دالة strcmp() لمقارنة سلسلتين نصيتين. تُعيد هذه الدالة قيمة عددية كـ نتيجة للمقارنة: إذا كانت السلسلتان متساويتين تُعيد 0، وإذا كانت السلسلة الأولى أصغر قاموسيًا تُعيد قيمة سالبة، وإذا كانت أكبر تُعيد قيمة موجبة. يجب تضمين مكتبة string.h عند استخدام strcmp().

2.2 دالة strncmp()

تُستخدم دالة strncmp() أيضًا لمقارنة السلاسل النصية ولكن تقارن عددًا محددًا من الأحرف فقط. على سبيل المثال، إذا كنت تريد مقارنة أول 3 أحرف فقط من سلسلتين. تُعد هذه الدالة أكثر أمانًا من الناحية الأمنية لأنها تقي من تجاوز سعة الذاكرة المؤقتة (buffer overflow). يتطلب استخدامها أيضًا تضمين مكتبة string.h.

3. أمثلة عملية على مقارنة السلاسل النصية

3.1 مثال على strcmp()

فيما يلي مثال على مقارنة السلاسل النصية باستخدام strcmp():

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple";
    char str2[] = "orange";

    int result = strcmp(str1, str2);

    if (result == 0) {
        printf("The strings are equal.n");
    } else if (result < 0) {
        printf("str1 is less than str2.n");
    } else {
        printf("str1 is greater than str2.n");
    }

    return 0;
}

في هذا البرنامج، تتم مقارنة str1 وstr2 باستخدام strcmp() ويتم عرض رسالة حسب النتيجة.

3.2 مثال على strncmp()

وفيما يلي مثال على استخدام strncmp():

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple";
    char str2[] = "application";

    int result = strncmp(str1, str2, 3);

    if (result == 0) {
        printf("The first 3 characters are equal.n");
    } else if (result < 0) {
        printf("str1 is less than str2 in the first 3 characters.n");
    } else {
        printf("str1 is greater than str2 in the first 3 characters.n");
    }

    return 0;
}

في هذا البرنامج، تتم مقارنة أول 3 أحرف فقط من كل سلسلة باستخدام strncmp().

4. معالجة الأخطاء والسلامة

4.1 معالجة الأخطاء

عند مقارنة السلاسل النصية، يجب الانتباه لعدم تمرير مؤشر NULL إلى الدوال مثل strcmp() أو strncmp()، حيث قد يؤدي ذلك إلى تعطل البرنامج. لذلك، من المهم التأكد من أن المؤشر ليس NULL قبل المقارنة.

4.2 الحماية من تجاوز سعة الذاكرة المؤقتة

يُستخدم strncmp() للحماية من تجاوز سعة الذاكرة المؤقتة (buffer overflow)، حيث تتم مقارنة عدد محدد من الأحرف فقط، مما يجعله أكثر أمانًا خاصة عند التعامل مع بيانات خارجية.

5. الخلاصة

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

6. الأسئلة الشائعة

6.1 ما الفرق بين strcmp() و strncmp()؟

strcmp() تقارن السلسلتين النصيتين بالكامل، بينما strncmp() تقارن عددًا محددًا من الأحرف فقط. غالبًا ما تُستخدم strncmp() للحماية من تجاوز سعة الذاكرة المؤقتة.

6.2 كيف أتعامل مع نتائج غير صفرية عند استخدام strcmp()؟

إذا كانت النتيجة سالبة فهذا يعني أن السلسلة الأولى أصغر قاموسيًا، وإذا كانت موجبة فهي أكبر. يتم التعامل مع النتيجة حسب متطلبات البرنامج.

6.3 ما الذي يجب الانتباه له عند التعامل مع مؤشرات NULL في مقارنة السلاسل النصية؟

تمرير مؤشر NULL إلى strcmp() أو strncmp() قد يؤدي إلى تعطل البرنامج. لذا يجب التأكد من أن المؤشرات ليست NULL قبل إجراء المقارنة.